正则表达式检查集合的第一个和最后一个字符是否不同

fra*_*pps 2 javascript regex regex-negation regex-lookarounds

假设我只有一串a's 和b's,如下所示:

aaabbbbababab
Run Code Online (Sandbox Code Playgroud)

如何构造一个正则表达式,仅当第二个和最后一个字符不同时才匹配给定的字符串?

这是我目前的尝试,正好相反(例如,如果第二个和最后一个字符相同,则匹配):

^[ab]([ab])[ab]*\1$
Run Code Online (Sandbox Code Playgroud)

我正在使用正则表达式的 ECMAScript 实现。

The*_*ird 5

您可以对第二个字符使用捕获组,并且仅在最后一个字符与捕获组 1 不同时才匹配它。

^[ab]([ab])[ab]*(?!\1)[ab]$
Run Code Online (Sandbox Code Playgroud)
  • ^ 字符串的开始
  • [ab]匹配 a 或 b(请注意,您可以省略,|因为它表示字符类中的管道字符
  • ([ab])捕获组 1,匹配 a 或 b
  • [ab]* 可选匹配 a 或 b
  • (?!\1) 负前瞻,使用反向引用断言与组 1 中捕获的值不同 \1
  • [ab]$ 匹配字符串末尾的 a 或 b

正则表达式演示

另一种选择是在捕获组之后立即进行断言

^[ab]([ab])(?![ab]*\1$)[ab]*$
Run Code Online (Sandbox Code Playgroud)

正则表达式演示

或者,如果支持,因为负向后视也可能有效。此页面显示了 Javascript 和lookbehinds 的兼容性

^[ab]([ab])[ab]*[ab]$(?<!\1)
Run Code Online (Sandbox Code Playgroud)

正则表达式演示