.NET正则表达式负面看起来不起作用

时间:2011-10-06 14:06:10

标签: .net regex

我正在尝试匹配以下文本(字符串中的任何位置),其中字符串可以是A和之间的任何内容;

Astring;

但我不想匹配以下

aAstring;
AAstring;

表达式(?<![A|a])A.*?;适用于aAstring;但不是AAstring;

看起来环视不适用于同一个角色?我必须在这里错过一些简单的东西。

3 个答案:

答案 0 :(得分:2)

如果string部分可以是任何字符串,则它会正确匹配。正则表达式中的A与文本中的第一个A匹配,.*?Astring匹配。在第一个A之前没有aA

如果您对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]).*?;"

如果下一个字符是AA,它将与a匹配,然后无法匹配。如果您希望确保字符串以A开头,而不是在较大字符串中的部分匹配,请将\b元字符添加到模式的开头:@"\bA(?![Aa]).*?;"