正则表达式匹配与第一个字符不同的字符

时间:2018-07-09 10:34:11

标签: ruby regex pattern-matching

我正在尝试使用正则表达式来匹配这样的模式:

(任何字母)(不同的字母)(再次相同的字母)

例如:

这些都是有效的示例:

aba
bcb
dbd

这些无效:

aab
aaa
bac

我正试图通过这种方式做到这一点:

(.)[^\1]\1

但是,这仍然匹配第二个字母与第一个字母相似的情况(例如:aaa)。看到这里:http://rubular.com/r/TTGEcyhE9g

正则表达式中是否可以匹配any letter except the captured one

2 个答案:

答案 0 :(得分:5)

后向引用在字符范围内无效。如下面的WiktorStribiżew所述,您在此处定义原始字符,在这种情况下,您将定义\x01(SOH,标题开始)字符。

作为解决方法,您可以按如下方式使用否定前瞻:

(.)(?!\1).\1

在这里,您要匹配的是没有跟相同字符(不消耗)的任何字符,再跟有任何字符(由于负前瞻而不同的字符),再匹配第一个字符。

您可以在Ruby documentation中了解有关先行和后行的更多信息。

答案 1 :(得分:1)

如果您喜欢使用正则表达式,则可以满足Wiktor的建议。但是,编写执行这些断言的基本Ruby脚本很容易:

input = "aea hello"
if input[0] == input[2] && input[0] != input[1]
    print "match"
else
    print "no match"
end