我有下面的正则表达式。
^(.*[^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-GUID
、2:GUID
和3: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在遇到@
时考虑任何事情。
2条答案
按热度按时间zz2j4svz1#
如果我没理解错的话,如果字符串的最后一部分是
:<whatever>
或@<whatever>
,那么第3组应该是空的:Regex demo.
只有最后一个组更改为
([^:@].*$|)
-将除^
/@
以外的任何字符匹配到字符串的末尾或匹配空字符串。whlutmcx2#
如果希望第三组为 none,可以将其替换为:
如果希望第三个组为 empty,可以用途:
这将查找
@
或:
。您可以根据需要向求反字符类添加更多字符。我的天啊
不过,还有一个我倾向于推荐的改进。目前,您的模式将匹配在某些位置有连字符但在其他位置没有连字符的GUID。要解决这个问题,我们可以在捕获组中添加第一个连字符,并将后面的连字符替换为反向引用:
我的天啊
请注意,在这种情况下,最后一个零件将位于组4中,而不是组3中。