正则表达式匹配捕获组前面没有某些字符
Posted
技术标签:
【中文标题】正则表达式匹配捕获组前面没有某些字符【英文标题】:Regular expression to match capture group not preceded by certain characters 【发布时间】:2021-07-29 02:39:50 【问题描述】:我想编写一个正则表达式,当且仅当模式前面没有字符“Etc/”时才会匹配。
应该匹配的字符串:
GMT+01:00
UTC+01:00
UTC+01
+01:00
...
应该不匹配的字符串:
Etc/GMT+01:00
Etc/UTC+01:00
Etc/UTC+01
...
这是我目前所拥有的:
(?<!Etc\/)((UTC|GMT)?(\+|\-)1(\d1,2)(:|\.)?(\d1,2)?)
上述正则表达式的右侧部分已经匹配了 UTC 和 GMT 偏移量,涵盖了我需要的所有情况。但我没有设法实现上述例外。
我希望上面的正则表达式与字符串Etc/GMT+1:00
不匹配。但实际上它匹配+01:00
部分,只忽略Etc/GMT
。
如果下面的正则表达式以“Etc/”开头,如何实现不匹配?
(UTC|GMT)?(\+|\-)1(\d1,2)(:|\.)?(\d1,2)?
Here我有一个示例,其中包含我需要的大多数用例。
【问题讨论】:
【参考方案1】:您可以在Etc/
之后添加\S*
以确保检查Etc/
,即使Etc/
和预期匹配之间有任何零个或多个非空白字符:
(?<!\bEtc/\S*)((UTC|GMT)?([+-])(\d1,2)[:.]?(\d1,2)?)
见.NET regex demo
详情:
(?<!\bEtc/\S*)
- 一个否定的后向查找,匹配一个没有紧跟在整个单词 Etc/
之前的位置,然后是零个或多个非空白字符
(UTC|GMT)?
- 可选子字符串,UTC
或 GMT
([+-])
- +
或 -
(\d1,2)
- 一位或两位数
[:.]?
- 可选的 :
或 .
(\d1,2)?
- 一个或两个数字的可选序列(等于(\d0,2)
)。
【讨论】:
【参考方案2】:由于您已经在组中捕获所有数据,因此另一种方法可能是排除 Etc/
的所有匹配项,并使用您的模式在组中捕获您想要的内容。
请注意,您可以将 (:|\.)
等单个字符的分组更改为 character class ([:.])
\bEtc/\S*|(UTC|GMT)?([+-])(\d1,2)([:.])?(\d1,2)?
\bEtc/\S*
匹配 Etc/
和可选的非空白字符
|
或者
(UTC|GMT)?([+-])(\d1,2)([:.])?(\d1,2)?
您的所有独立组的模式。
Regex demo
或者只有一个组:
\bEtc/\S*|((?:GMT|UTC)?\+\d2(?:[:.]\d2)?)
Regex demo
【讨论】:
以上是关于正则表达式匹配捕获组前面没有某些字符的主要内容,如果未能解决你的问题,请参考以下文章
Perl 中的正则表达式组:如何从正则表达式组中捕获与字符串中出现的未知数量/多个/变量匹配的元素到数组中?