Regex模式允许的字母数字,一堆特殊字符,但不一定顺序的字符
-
06-07-2019 - |
题
我有以下regex:
(?!^[&#]*$)^([A-Za-z0-9-'.,&@:?!()$#/\\]*)$
因此,请允许的A-Z,a-Z,0-9,并且这些特殊字符 '.,&@:?!()$#/\
我想不匹配如下设置的字符遇到的任何地方在串这个顺序:
&#
当我运行这个regex只有"&#"作为输入的,它不符合我的模式,我得到一个错误,巨大的。当我运行regex与 '.,&@:?!()$#/\ABC123
它不符合我的模式,没有错误。
但是当我运行为:
'.,&#@:?!()$#/\ABC123
它不会错误。我做错了什么的检查&#序列。
可以有人告诉我我做错了,我不是伟大的与这些事情。
解决方案
借用匹配引用字符串的技巧,从字符类中删除&
,为&
而不是添加替代<代码>#,并允许字符串可选地以&amp;
结尾:
<代码> ^(?(:[?!A-ZA-Z0-9 - ”,@:()$#/ \\] + |&安培; [^#])*&安培)$ 代码>
其他提示
我实际上会分两部分来做:
- 检查您允许的字符集。要做到这一点,我会寻找不允许的字符,如果有匹配则返回false。这意味着我有一个很好的简单表达式:
<代码> [^ A-ZA-Z0-9' \&安培; @:?!()$#^] 代码> - 检查您的禁用子字符串。因为它只是一个子串,我可能甚至不会使用正则表达式。 醇>
您没有提及您的语言,但如果是在C#中:
bool IsValid(string input)
{
return !( input.Contains("&#")
|| Regex.IsMatch(@"[^A-Za-z0-9'\.&@:?!()$#^]", input)
);
}
<代码> ^((&安培;#)[A-ZA-Z0-9 - ”,&安培; @:?!()$#/ \\]?!)* $ 代码>
请注意,最后一个\被转义(加倍)
SO会自动将 \\
转换为\,如果不是在反引号中
假设Perl兼容RegExp
要匹配字符串'&amp;#':
<代码>(?![^&安培;] *&安培;#)^([A-ZA-Z0-9 - ”,&安培; @:()$#/ \\?!] *)$ 代码>
虽然您不需要括号,因为您匹配整个字符串。
仅供参考,虽然Ben Blank的正则表达式有效,但它比它需要的更复杂。我会这样做:
^(?:[A-Za-z0-9-'.,@:?!()$#/\\]+|&(?!#))+$
因为我使用了负前瞻而不是否定字符类,所以正则表达式不需要任何额外的帮助来匹配字符串末尾的&符号。
我建议使用两个经常表达的一个条件:
if (string has sequence "&#")
return false
else
return (string matches sequence "A-Za-z0-9-'.,&@:?!()$#/\")
我相信你的第二个"主要"regex的
^([A-Za-z0-9-'.,&@:?!()$#/\])$"
有几个错误:
- 它将测试只有一个角色在设置你的
- 的
\
性格中经常表达是一个令指示下一字一部分的某种"类别"的字符的(ex。\n
=是线料字符)。字符序列\]
实际上造成方括号内列不要被终止。
你可能会更好利用
^[A-Za-z0-9-'.,&@:?!()$#/\\]+$
注意,削减字表示的是由双斜线。
的 +
字表明,至少有一个角色正在测试具有相匹配的regex;如果它是好通过一个零的长串,替换 +
与 *
.