我需要检查字符串是否包含模式:以“A”开头,后跟零或多个空格,然后是“B”以外的任何字符。
因此,以下内容必须匹配:"A"
。 "AX"
,"A X"
,"A "
,"A XB"
以下字符串不得匹配:"AB"
,"A B"
我天真的尝试是A\s*(?!B)
,但它与不受欢迎的"A B"
匹配。
答案 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"
。