我正在尝试匹配以下文本(字符串中的任何位置),其中字符串可以是A和之间的任何内容;
Astring;
但我不想匹配以下
aAstring;
AAstring;
表达式(?<![A|a])A.*?;
适用于aAstring;但不是AAstring;
看起来环视不适用于同一个角色?我必须在这里错过一些简单的东西。
答案 0 :(得分:2)
如果string
部分可以是任何字符串,则它会正确匹配。正则表达式中的A
与文本中的第一个A
匹配,.*?
与Astring
匹配。在第一个A
之前没有a
或A
。
如果您对string
部分有一些规则,那么您应该添加它们,它应该可以解决您的问题。
答案 1 :(得分:2)
首先,这是一个外观,而不是前瞻。要了解这里发生了什么,请分解正则表达式所说的内容:
(?<![A|a])A #An A that is not preceded by A, a, or a literal |
.?; #Any number of characters followed by ;
现在考虑一下您的输入AAstring
:
A #An A that is not preceded by A (because it's at the beginning of the string)
Astring #Some characters followed by ;
所以看起来很有效,它只是不按照你的想法去做。我想你想要的是这样的:
^(?![Aa]{2})A.*?;
它将自身锚定在字符串的开头,因此您可以知道前瞻的外观。这就是它的含义:
^ #Beginning of the line
(?![Aa]{2}) #"The following string must not start with two As in a row, regardless of case"
A.*?; #Capital A followed by anything followed by ;
您也可以尝试
\b(?![Aa]{2})A.*?;
如果您的目标不在该行的最开头。
请注意,这实际上与^A(?![Aa]).*?;
或\bA(?![Aa]).*?;
相同,但上述内容可能更容易理解。
答案 2 :(得分:1)
负面的后卫工作正常。为了实现您的尝试,我建议使用负面预测,如此模式所示:"A(?![Aa]).*?;"
如果下一个字符是A
或A
,它将与a
匹配,然后无法匹配。如果您希望确保字符串以A
开头,而不是在较大字符串中的部分匹配,请将\b
元字符添加到模式的开头:@"\bA(?![Aa]).*?;"