C# .NET正则表达式匹配

C# .NET正则表达式匹配,c#,regex,matching,C#,Regex,Matching,概括地说:如何将一个单词与a)开头、b)整个单词和c)结尾的正则表达式规则相匹配 更具体地说:如何匹配具有以下规则的长度>=1的表达式: 它不能有以下任何内容:!@# 它不能以空格或空格开头= 它不能以空格结尾 我试过: ^[^\s=][^!@#]*[^\s]$ 但是匹配的^[^\s=]将超过单词中的第一个字符。因此,这也匹配以“!”开头的单词或“@”或“#”(如“#ab”或“@aa”)。这还强制单词至少有2个字符(一个开头字符不是空格或=,另一个结尾字符是非空格) 我必须: ^[^\s=(!

概括地说:如何将一个单词与a)开头、b)整个单词和c)结尾的正则表达式规则相匹配

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

  • 它不能有以下任何内容:!@#
  • 它不能以空格或空格开头=
  • 它不能以空格结尾
  • 我试过:

    ^[^\s=][^!@#]*[^\s]$
    
    但是匹配的
    ^[^\s=]
    将超过单词中的第一个字符。因此,这也匹配以“!”开头的单词或“@”或“#”(如“#ab”或“@aa”)。这还强制单词至少有2个字符(一个开头字符不是空格或=,另一个结尾字符是非空格)

    我必须:

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

    对于匹配前两个规则的正则表达式。但是如何将单词中没有尾随空格与允许长度为1的单词进行匹配?

    您的第一次尝试非常接近。您只需为第一部分和最后两部分排除更多字符,并将最后两部分设置为可选:

    ^[^\s=!@#](?:[^!@#]*[^\s!@#])?$
    
    这样可以确保所有三个部分都不包含任何
    @#。然后,如果单词的长度超过一个字符,则需要以not空格结尾,中间的空格只填充选定字符。由于
    ^
    $
    锚定,这一切都得到了正确实施


    我不太确定您的第二个示例是否匹配,因为
    ()
    在嵌入字符类时应该作为文字字符,而不是作为捕获组。

    Cameron的解决方案既准确又高效(并且应该用于需要优化速度的任何生产代码)。这里给出的答案效率较低,但演示了使用正则表达式应用逻辑的一般方法

    您可以使用多个正向和负向lookahead正则表达式断言(所有断言都应用于目标字符串中的一个位置,通常是开头),为匹配应用多个逻辑约束。下面注释的正则表达式演示了对于这个示例来说这是多么容易。您确实需要了解正则表达式引擎实际上是如何匹配(和不匹配)的,以获得正确的表达式,但一旦掌握了窍门,就不难了

    foundMatch=Regex.IsMatch(subjectString,@”
    #匹配满足多个逻辑约束的“word”。
    ^#锚定至管柱起点。
    (?=[^!@#]*$)#它不能有以下任何一项:!@#,和
    (?![=])它不能以空格或=,和开头
    (?!.*\S$)#它不能以空格结尾,并且
    .{1,}#长度>=1(可以匹配特殊的“单词”)
    \z#锚定在绳子的末端。
    ", 
    RegexOptions.ignorepattern(空格);
    

    “正则表达式逻辑”的这个应用程序经常用于复杂的密码验证。

    +1用于我几周来看到的第一个正则表达式问题,其中包括以前失败的尝试。换句话说,+1是一个真正的正则表达式问题。