.NET匹配正则表达式匹配

.NET匹配正则表达式匹配

问题描述:

概括地说:我如何将一个单词与正则表达式规则匹配:a)开始,b)整个单词,以及c)结束?.NET匹配正则表达式匹配

更具体地说:我如何匹配有以下规则长度> = 1的表达:

  1. 它不能有任何的! @#
  2. 它不能以空格开头或=
  3. 它不能用空格

我试图结束:

^[^\s=][^[email protected]#]*[^\s]$ 

但在字^[^\s=]匹配移动经过第一个字符。因此,这也匹配以'!'开头的单词或'@'或'#'(例如:'#ab'或'@aa')。这也迫使这个单词至少有2个字符(一个起始字符不是空格或= - 和 - 最后一个非空格字符)。

我到:

^[^\s=([email protected]#)]\1*$ 

匹配前两个规则,一个正则表达式。但是,如何匹配单词中没有尾部空格并允许长度为1的单词?

+2

+1对于我已经在几周内看到的第一个正则表达式问题,包括以前失败的尝试。换句话说,+1是一个*真正的*正则表达式问题。 – 2011-04-09 02:57:32

你的第一次尝试非常接近。你只需要排除更多的字符的第一个和最后一个部分,并进行最后的两个部分可选:

^[^\[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); 

“的正则表达式逻辑”的本申请经常用于复杂的密码验证。