.NET匹配正则表达式匹配
问题描述:
概括地说:我如何将一个单词与正则表达式规则匹配:a)开始,b)整个单词,以及c)结束?.NET匹配正则表达式匹配
更具体地说:我如何匹配有以下规则长度> = 1的表达:
- 它不能有任何的! @#
- 它不能以空格开头或=
- 它不能用空格
我试图结束:
^[^\s=][^[email protected]#]*[^\s]$
但在字^[^\s=]
匹配移动经过第一个字符。因此,这也匹配以'!'开头的单词或'@'或'#'(例如:'#ab'或'@aa')。这也迫使这个单词至少有2个字符(一个起始字符不是空格或= - 和 - 最后一个非空格字符)。
我到:
^[^\s=([email protected]#)]\1*$
匹配前两个规则,一个正则表达式。但是,如何匹配单词中没有尾部空格并允许长度为1的单词?
答
你的第一次尝试非常接近。你只需要排除更多的字符的第一个和最后一个部分,并进行最后的两个部分可选:
^[^\[email protected]#](?:[^[email protected]#]*[^\[email protected]#])?$
这确保了所有三个部分将不包括任何的[email protected]#
。然后,如果该单词长度超过一个字符,它将需要以非空格结束,只有选择字符填充中间的空格。由于^
和$
锚点,这一切都得到了正确执行。
我不太清楚你的第二个例子是否匹配,因为()
在嵌入字符类中时应该被当作文字字符,而不是作为捕获组。
答
Cameron的解决方案既准确又高效(应该用于需要优化速度的任何生产代码)。这里给出的答案效率较低,但是展示了使用正则表达式应用逻辑的一般方法。
您可以使用多个正面和负面的lookahead正则表达式断言(全部应用于目标字符串中的一个位置 - 通常是开头),以便为匹配应用多个逻辑约束。下面的注释的正则表达式演示了这个例子很容易实现。您需要了解正则表达式引擎如何匹配(并且不匹配),以提出正确的表达式,但是一旦您掌握正确的表达式就不难了。
foundMatch = Regex.IsMatch(subjectString, @"
# Match 'word' meeting multiple logical constraints.
^ # Anchor to start of string.
(?=[^[email protected]#]*$) # It cannot have any of: ! @ #, AND
(?![ =]) # It cannot begin with a space or =, AND
(?!.*\S$) # It cannot end with a space, AND
.{1,} # length >= 1 (ok to match special 'word')
\z # Anchor to end of string.
",
RegexOptions.IgnorePatternWhitespace);
“的正则表达式逻辑”的本申请经常用于复杂的密码验证。
+1对于我已经在几周内看到的第一个正则表达式问题,包括以前失败的尝试。换句话说,+1是一个*真正的*正则表达式问题。 – 2011-04-09 02:57:32