制作条件正则表达式

时间:2012-01-31 17:36:41

标签: c# asp.net .net regex

我有一些麻烦来制作这个正则表达式:

如果输入包含此符号"<"后面紧跟一个字母,我只想让regexp测试失败,例如:<[^a-zA-Z]

但即使找不到"<",我也希望它能够正常工作。我怎么能这样做?

编辑:一些例子

<Wrong example
Wrong <Example

Good Example
< Good Example
Good < Example
Good< Example
Good Example<

编辑2: 使用asp.net时,您无法在输入中发送包含此文本的表单,例如:

<Previous

编辑3:这个正则表达式将在一个我无法更改的控件中传递,它通过使用正则表达式验证输入来工作。因此我无法匹配输入错误

4 个答案:

答案 0 :(得分:2)

负面的前瞻性正则表达式本身就像

^(?!.*<[a-zA-Z])

会检查一个字母是否从未跟随左尖括号,但是空字符串符合您的条件。你还需要确保它至少包含一个alpha吗?

^(?!.*<[a-zA-Z]).*[a-zA-Z]

Perl:

while (<DATA>) {
  print if  /^(?!.*<[a-zA-Z])/;
}

__DATA__
<Wrong example
Wrong <Example
Good Example
< Good Example
Good < Example
Good< Example
Good Example<

<强>输出

Good Example
< Good Example
Good < Example
Good< Example
Good Example<

答案 1 :(得分:1)

匹配错误的输入和黑名单可能更简单,而不是匹配良好的输入并将其列入白名单。

拒绝任何与以下正则表达式匹配的输入:

<[a-zA-Z]

如果你真的需要一个白名单解决方案(因为你不能控制实际的验证逻辑,只有正则表达式),你可以这样做:

^(?:[^<]|<[^a-zA-Z]|<$)*$

(如果您还想确保输入是非空的,可以将最后一个Kleene星更改为加号。)

答案 2 :(得分:0)

您可以使用[a-zA-Z]*(<[^a-zA-Z])?[a-zA-Z]*

答案 3 :(得分:0)

编辑:也许不是最理想的模式,但它符合您的“好”示例,与您的“错误”示例不符:

^((^|(<[^a-zA-Z]|[^<a-zA-Z])+)[a-zA-Z]+)+(<[^a-zA-Z]*|[^<a-zA-Z]*)$

我想你想用括号后跟一个?表示该模式的零次或一次出现:

(<[^a-zA-Z])?

我假设您正在构建一个更大的正则表达式模式,并且只是其中的一部分。

相关问题