捕获组减法/否定

时间:2015-12-17 13:17:25

标签: c# .net regex

我似乎无法减少或否定被捕获的群体。 鉴于这些字符串示例:

  • " AA"
  • " AB"

正则表达式:@"([a-z])[^\1]"@"([a-z])[\w-[\1]]" 我希望第一个匹配失败,第二个匹配成功,但在两种情况下都成功。我面临着一个更复杂的正则表达式,但我把它简化到这个级别。在方括号中引用捕获的组的语法是否不同?

编辑:不幸的是我认为这个简化版本对真实版本有好处。在这里。

假设字符串:

  1. " ABCDF"
  2. " AABB"
  3. " aacbb"
  4. " AACAA"
  5. 和正则表达式:@"([a-z])\1.*?(?!(\1))\2"

    我希望2.和3.是真的。 4应该是假的,因为" aa" ==" aa"

3 个答案:

答案 0 :(得分:2)

在字符类[]内部,正则表达式解释器遵循不同的规则。考虑保留用于制作字符范围的字符-的特殊处理(即。[a-z])。

因此\1内部被视为ASCII代码1[^\1]意味着:每个不是ascii控件的char 1 start of标题)。

<强>更新

为了您的编辑,您将近在咫尺,尝试使用此正则表达式(我不认为您需要点部分.*?中的延迟修饰符):

@"^([a-z])\1.*((?!\1)[a-z])\2$"

Online demo

<强>勒亘

^              # match start of the string
 ([a-z])       # Capturing Group 1 (\1): a single lowercase letter
 \1            # the same char of \1 again
 .*            # any char zero or more times
 ((?!\1)[a-z]) # Capturing Group 2 (\2): a lowercase letter that is not equal to \1
 \2            # the same char of \2 again
$

答案 1 :(得分:1)

你需要使用否定的先行断言。

@"([a-z])(?!\1)."

如果有必要,可以使用锚点。

@"^([a-z])(?!\1).$"

DEMO

答案 2 :(得分:1)

在你的例子中

([a-z])\1.*?(?!(\1))\2

表达式([a-z])将捕获一个字符。诉讼\1将再次匹配相同的字符。所以到目前为止,我们要求连续两个相同的字符。

.*?将匹配任何内容,直到被\1的字符终止。

最终\2不存在,因此它总是会失败正则表达式。第二个分组括号在外观中,并且不会捕获外观。

如果最终\2不在那里,那么比赛将重新开始。

因此,如果您删除最终\2,那么您将获得2,3和4的匹配,这些匹配始终捕获aabb,因为正则表达式将重新开始。您可以添加终止字符以防止这种情况,但我们需要知道数据的格式。例如,您是匹配单行还是多行?