生成条件正则表达式

本文关键字:正则表达式 条件 | 更新日期: 2023-09-27 18:22:13

我在制作这个正则表达式时遇到了一些问题:

我只是想让regexp测试失败,如果输入包含直接跟在字母后面的符号"<",例如:<[^a-zA-Z]

但我希望它能工作,即使没有找到"<"。我该怎么做?

EDIT:一些例子

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

第2版:当使用asp.net时,您不能在输入中发送包含以下文本的表单,例如:

<Previous

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

生成条件正则表达式

类似的负前瞻正则表达式

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

会检查一个字母是否从未跟在左括号后面,但一个空字符串会符合您的标准。你还需要确保它至少包含一个阿尔法,像这样吗?

^(?!.*<[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<

匹配坏输入和黑名单可能会更简单,而不是匹配好输入和白名单。

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

<[a-zA-Z]

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

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

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

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

EDIT:也许不是最理想的模式,但它与你的"好"示例相匹配,与你的"错误"示例不匹配:

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

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

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

我假设您正在构建一个更大的regex模式,它只是其中的一部分。