我似乎无法减少或否定被捕获的群体。 鉴于这些字符串示例:
正则表达式:@"([a-z])[^\1]"
或@"([a-z])[\w-[\1]]"
我希望第一个匹配失败,第二个匹配成功,但在两种情况下都成功。我面临着一个更复杂的正则表达式,但我把它简化到这个级别。在方括号中引用捕获的组的语法是否不同?
编辑:不幸的是我认为这个简化版本对真实版本有好处。在这里。
假设字符串:
和正则表达式:@"([a-z])\1.*?(?!(\1))\2"
我希望2.和3.是真的。 4应该是假的,因为" aa" ==" aa"
答案 0 :(得分:2)
在字符类[]
内部,正则表达式解释器遵循不同的规则。考虑保留用于制作字符范围的字符-
的特殊处理(即。[a-z]
)。
因此\1
内部被视为ASCII代码1
而[^\1]
意味着:每个不是ascii控件的char 1
( start of标题)。
<强>更新强>
为了您的编辑,您将近在咫尺,尝试使用此正则表达式(我不认为您需要点部分.*?
中的延迟修饰符):
@"^([a-z])\1.*((?!\1)[a-z])\2$"
<强>勒亘强>
^ # 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)
答案 2 :(得分:1)
在你的例子中
([a-z])\1.*?(?!(\1))\2
表达式([a-z])
将捕获一个字符。诉讼\1
将再次匹配相同的字符。所以到目前为止,我们要求连续两个相同的字符。
.*?
将匹配任何内容,直到被\1
的字符终止。
最终\2
不存在,因此它总是会失败正则表达式。第二个分组括号在外观中,并且不会捕获外观。
如果最终\2
不在那里,那么比赛将重新开始。
因此,如果您删除最终\2
,那么您将获得2,3和4的匹配,这些匹配始终捕获aa
和bb
,因为正则表达式将重新开始。您可以添加终止字符以防止这种情况,但我们需要知道数据的格式。例如,您是匹配单行还是多行?