.NET正则表达式匹配

5

总的来说:我如何使用正则表达式规则匹配单词的a)开头,b)整个单词,c)结尾?

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

  1. 它不能包含以下任何一个字符:! @ #
  2. 它不能以空格或=开头
  3. 它不能以空格结尾

我尝试了:

^[^\s=][^!@#]*[^\s]$

但是^[^\s=]匹配会跳过单词的第一个字符。因此,它也会匹配以'!'、'@'或'#'开头的单词(例如:'#ab'或'@aa')。这也要求单词至少有2个字符(一个不是空格或等号的开头字符-和-一个非空格字符在结尾)。

我得到:

^[^\s=(!@#)]\1*$

对于第一和第二规则的正则表达式匹配,但如何在允许长度为1的单词的情况下匹配没有尾随空格的单词?


2
+1 因为这是我几周以来看到的第一个包含之前失败尝试的正则表达式问题。换句话说,+1 是一个真正的正则表达式问题。 - R. Martinho Fernandes
2个回答

4
Cameron的解决方案既准确又高效(在需要优化速度的任何生产代码中都应该使用)。这里提供的答案效率较低,但演示了使用正则表达式应用逻辑的一般方法。您可以使用多个正向和负向前瞻正则表达式断言(全部应用于目标字符串的一个位置 - 通常是开头),以应用多个逻辑约束条件进行匹配。下面的注释正则表达式演示了如何轻松完成此示例用例。您需要理解正则表达式引擎实际如何匹配(不匹配)才能想出正确的表达式,但一旦掌握了它,就不难。
foundMatch = Regex.IsMatch(subjectString, @"
    # Match 'word' meeting multiple logical constraints.
    ^             # Anchor to start of string.
    (?=[^!@#]*$)  # 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);

“正则表达式逻辑”在复杂密码验证中经常使用。


3

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

^[^\s=!@#](?:[^!@#]*[^\s!@#])?$

这确保了所有三个部分都不包含任何 !@#。然后,如果 这个单词长于一个字符,则需要以非空格字符结尾,在空间中只填充特定字符。由于使用了 ^$的锚点,所有这些都被正确强制执行。

我不太确定您给出的第二个示例匹配的是什么,因为在字符类中嵌入时,() 应该被视为文字字符,而不是捕获组。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接