正则表达式检查集合的第一个和最后一个字符是否不同
假设我只有一串a's 和b's,如下所示:
aaabbbbababab
如何构造一个正则表达式,仅当第二个和最后一个字符不同时才匹配给定的字符串?
这是我目前的尝试,正好相反(例如,如果第二个和最后一个字符相同,则匹配):
^[ab]([ab])[ab]*1$
我正在使用正则表达式的 ECMAScript 实现。
回答
您可以对第二个字符使用捕获组,并且仅在最后一个字符与捕获组 1 不同时才匹配它。
^[ab]([ab])[ab]*(?!1)[ab]$
^字符串的开始[ab]匹配 a 或 b(请注意,您可以省略,|因为它表示字符类中的管道字符([ab])捕获组 1,匹配 a 或 b[ab]*可选匹配 a 或 b(?!1)负前瞻,使用反向引用断言与组 1 中捕获的值不同1[ab]$匹配字符串末尾的 a 或 b
正则表达式演示
另一种选择是在捕获组之后立即进行断言
^[ab]([ab])(?![ab]*1$)[ab]*$
正则表达式演示
或者,如果支持,因为负向后视也可能有效。此页面显示了 Javascript 和lookbehinds 的兼容性
^[ab]([ab])[ab]*[ab]$(?<!1)
正则表达式演示