具有可选部分和否定前瞻的正则表达式

时间:2017-08-02 14:18:04

标签: c# regex regex-negation

我需要检查字符串是否包含模式:以“A”开头,后跟零或多个空格,然后是“B”以外的任何字符。

因此,以下内容必须匹配:"A""AX""A X""A ""A XB"

以下字符串不得匹配:"AB""A B"

我天真的尝试是A\s*(?!B),但它与不受欢迎的"A B"匹配。

3 个答案:

答案 0 :(得分:2)

如果您只是需要变为真或假,您可以将\s*放入前瞻:

Regex.IsMatch(s, @"A(?!\s*B)")

它找到A后面没有0+空格,后跟B

请参阅regex demo

在您的模式A\s*(?!B)中,可以在任何0+空格之后执行否定前瞻,并且一旦找到未跟随B的空格,则返回有效匹配(由于由于\s*量化模式,可以回溯。

如果您需要实际匹配A及其后的空格,但如果这些空格未跟B,请使用我的评论中的模式。

(?>A\s*)(?!B)

此模式匹配:

  • (?>A\s*) - 一个原子组,匹配A,然后是0 +空格,没有回溯到组模式允许
  • (?!B) - 空格后没有B,或整场比赛失败。

答案 1 :(得分:1)

更新: 根据以下评论,使用此模式A\s*B|(A)并检查组#1

使用此模式A\s*+(?!B)\w* Demo

#    A\s*+(?!B)\w*
A           # "A"
\s          # <whitespace character>
*+          # (zero or more)(possessive)
(?!         # Negative Look-Ahead
  B         # "B"
)           # End of Negative Look-Ahead
\w          # <ASCII letter, digit or underscore>
*           # (zero or more)(greedy)

或根据您的尝试,使用此A\s*+(?!B)

答案 2 :(得分:0)

该尝试不起作用,因为它与"A"之前的" B"匹配,我建议尝试采取否定方法,并撰写A\s*B并使用所有非匹配线。例如,使用grep grep -v "A\\s*B"

如果需要A并且有非A行,您可以搜索两次,grep A | grep -v "A\\s*B"