匹配除先前组选择的字符外的任何字符

时间:2019-03-23 13:15:58

标签: c# regex

我有这个正则表达式:

(?=(([a-z]{1})([a-z]{1})\2))

通过它,我试图获取所有回文字符串。因此,如果这是我的字符串:

mnonopooo

我的正则表达式确实选择了字符串中的所有回文字符串,但是它也选择了ooo,我知道原因,这是因为正则表达式的这一中心部分:

(?=(([a-z]{1})     "([a-z]{1})"        \2)) 

这部分应该像这样,匹配除反向引用组\2之外的所有内容。

所以我尝试了类似的方法,但是没有用:

(?=(([a-z]{1})     (?!\2)       \2)) 

所以基本上,我的正则表达式包含三个部分:

  1. 选择任何单个字符(可以使用)
  2. 匹配任何不等于第1点匹配字符的单个字符(无效)
  3. 选择与第1点匹配的相同字符(使用向后引用)

因此,第二部分我无法完成。 有人可以帮忙吗

1 个答案:

答案 0 :(得分:2)

只需添加否定的Lookahead(即(?!\2)),以确保不会重复第一个匹配的字母,并保持第3个组不变(您仍然需要):

(?=(([a-z])(?!\2)([a-z])\2))

请注意,{1}的使用是多余的,因此我将其删除。

演示:https://regex101.com/r/BVvwnp/1