生成条件正则表达式
本文关键字:正则表达式 条件 | 更新日期: 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模式,它只是其中的一部分。