繁体   English   中英

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

[英]Regex expression to check if first and last char of set are different

假设我有一串只有ab的字符串,如下所示:

aaabbbbababab

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

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

^[ab]([ab])[ab]*\1$

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

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

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

正则表达式演示

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

^[ab]([ab])(?![ab]*\1$)[ab]*$

正则表达式演示

或者,如果支持,因为负面的后视也可能起作用。 此页面显示 Javascript 的兼容性和后视

^[ab]([ab])[ab]*[ab]$(?<!\1)

正则表达式演示

如果您不必验证整个字符串是一堆ab ,那么我会 go 用于通用的东西,例如:

^.(.).*(?!\1).$
  • ^. - 从一个字符开始
  • (.) - 将第二个字符放入捕获组
  • .* - 可选地捕获前进的所有内容
  • (?.\1).$ - 确保最终字符与第二个字符不同

https://regex101.com/r/k47PUu/1/

只是为了替代,你可以尝试:

^[ab]{3,}(?<!^.\1.*(.))$

查看在线演示

  • ^ - 起始线锚。
  • [ab]{3,} - 3 次以上的字面意思是“a”或“b”。
  • (?<.^.\1.*(.) - 否定后向断言最后一个字符与第二个字符不同。
  • $ - 结束线锚。

或者,您可以尝试负前瞻(奇怪的是,这是测试时最有效的):

^(?!.(.).*\1$)[ab]{3,}$

查看在线演示

  • ^ - 起始线锚。
  • (?..(.).*\1$) - 断言第二个字符的负前瞻与结束行锚点之前的最后一个字符不同。
  • [ab]{3,} - 3 次以上的字面意思是“a”或“b”。
  • $ - 结束线锚。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM