[英]Regex ignore everything after a character
我有以下正则表达式。
^(.*[^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 后的第 3 组为空。
Input: /user/questions/9c8a8823-d88c-4402-a2c1-4530a966f993@help
Results:
Group 1: /user/questions/
Group 2: 9c8a8823-d88c-4402-a2c1-4530a966f993
Group 3:
换句话说,我不希望正则表达式在遇到@
时考虑任何事情。
如果您希望第三组为none ,您可以将其替换为:
([^@:].*$)?
如果你想让第三组为空,你可以使用:
([^@:].*$|)
这将查找@
或:
。 您可以根据需要在否定字符 class 中添加更多字符。
演示。
不过,我倾向于推荐另外一项改进。 目前,您的模式将匹配在某些地方有连字符但在其他地方没有的 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 组中。
如果我理解正确的话,如果字符串的最后一部分是:<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})([^:@].*$|)
只有最后一组更改为([^:@].*$|)
- 匹配任何字符,但:
/ @
到字符串结尾或匹配空字符串。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.