regex 正则表达式忽略字符后所有内容

dvtswwa3  于 2022-11-26  发布在  其他
关注(0)|答案(2)|浏览(145)

我有下面的正则表达式。

^(.*[^0-9])([0-9A-Fa-f]{8}[-]?[0-9A-Fa-f]{4}[-]?[0-9A-Fa-f]{4}[-]?[0-9A-Fa-f]{4}[-]?[0-9A-Fa-f]{12})(.*)$

它将给定的文本分为3组。1:Pre-GUID2:GUID3:post-GUID文本。

Input: /user/questions/9c8a8823-d88c-4402-a2c1-4530a966f993/help

Results:
Group 1: /user/questions/
Group 2: 9c8a8823-d88c-4402-a2c1-4530a966f993
Group 3: /help

然而,我有一些示例,其中GUID后面跟着一个特殊字符,如@,在这种情况下,我想忽略GUID忽略后的所有内容,即第三组是后GUID为空。

Input: /user/questions/9c8a8823-d88c-4402-a2c1-4530a966f993@help

Results:
Group 1: /user/questions/
Group 2: 9c8a8823-d88c-4402-a2c1-4530a966f993
Group 3:

换句话说,我不希望regex在遇到@时考虑任何事情。

zz2j4svz

zz2j4svz1#

如果我没理解错的话,如果字符串的最后一部分是:<whatever>@<whatever>,那么第3组应该是空的:

^(.*[^0-9])([0-9A-Fa-f]{8}[-]?[0-9A-Fa-f]{4}[-]?[0-9A-Fa-f]{4}[-]?[0-9A-Fa-f]{4}[-]?[0-9A-Fa-f]{12})([^:@].*$|)

Regex demo.
只有最后一个组更改为([^:@].*$|)-将除^/@以外的任何字符匹配到字符串的末尾或匹配空字符串。

whlutmcx

whlutmcx2#

如果希望第三组为 none,可以将其替换为:

([^@:].*$)?

如果希望第三个组为 empty,可以用途:

([^@:].*$|)

这将查找@:。您可以根据需要向求反字符类添加更多字符。
我的天啊
不过,还有一个我倾向于推荐的改进。目前,您的模式将匹配在某些位置有连字符但在其他位置没有连字符的GUID。要解决这个问题,我们可以在捕获组中添加第一个连字符,并将后面的连字符替换为反向引用:

^(.*[^0-9])([0-9A-Fa-f]{8}(-?)[0-9A-Fa-f]{4}\3[0-9A-Fa-f]{4}\3[0-9A-Fa-f]{4}\3[0-9A-Fa-f]{12})([^@:].*$)?

我的天啊
请注意,在这种情况下,最后一个零件将位于组4中,而不是组3中。

相关问题