为什么我的正则表达式没有抓住前缀的最后一个字符?

时间:2018-05-18 20:06:13

标签: regex

使用以下正则表达式,结果中始终包含最后一个字符。我不知道为什么。从我所知道的一切,它应该忽略整个字符串,包括S.

正则表达式:(?!XQS|QS)\w+(?!X?QS)\w+

测试数据:

XQSedbc6ba985837c6fc990642cd3987769
QS3e05a46c5e0728bc72b40a5d5402d933
XQS10fc2d802c082c75bd069ebfad0f31a4
QS983b36e91e2ba2089760a4d41089a0b3
ea9b8c6ca9edd686f3a25c319d3f5507

匹配以下字符串:

Sedbc6ba985837c6fc990642cd3987769
S3e05a46c5e0728bc72b40a5d5402d933
S10fc2d802c082c75bd069ebfad0f31a4
S983b36e91e2ba2089760a4d41089a0b3
ea9b8c6ca9edd686f3a25c319d3f5507

但是我想要以下字符串:

edbc6ba985837c6fc990642cd3987769
3e05a46c5e0728bc72b40a5d5402d933
10fc2d802c082c75bd069ebfad0f31a4
983b36e91e2ba2089760a4d41089a0b3
ea9b8c6ca9edd686f3a25c319d3f5507

这需要与第0组的整个正则表达式相匹配。它使用Java构建的不可知解析器。我试图避免代码更改。

2 个答案:

答案 0 :(得分:2)

如果您的工具使用Java风格,您可以使用:

(?<=X?QS).+$|^(?:(?!X?QS).)+$

Live demo

故障:

  • (?<=X?QS)断言前面的字符是XQS还是QS(您不需要X??)
  • .+$匹配输入字符串/行的结尾
  • |
  • ^匹配输入字符串/行的开头
  • (?:开始非捕获组
    • (?!X?QS).如果下一个字符不是X,请取一个字符?QS
  • )+ CG结束,尽可能多地重复
  • $输入字符串/行的结尾

答案 1 :(得分:0)

Lookahead在这种情况下不会工作,因为它只是增加位置
直到断言通过。

看看背后是你需要什么,因为它有更多的力量。

(?m)(?:\w(?<!^XQS)(?<!^QS))+$

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

但是,你可以选择最快的方式,那就是消费 断言中的内容,并捕捉其后的内容。

^(?:X?QS)?(\w+)$