正则表达式匹配捕获组前面没有某些字符

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

详情

(?&lt;!\bEtc/\S*) - 一个否定的后向查找,匹配一个没有紧跟在整个单词 Etc/ 之前的位置,然后是零个或多个非空白字符 (UTC|GMT)? - 可选子字符串,UTCGMT ([+-]) - +- (\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 中的正则表达式组:如何从正则表达式组中捕获与字符串中出现的未知数量/多个/变量匹配的元素到数组中?

linux shell:提取正则表达式捕获组(catch group)匹配的字符串

具有多个捕获组的 R 中的正则表达式组捕获

正则表达式中 如何取出所有组中的值?

perl学习正则表达式