正则表达式匹配除字符组合之外的所有字符

时间:2021-03-24 01:04:12

标签: regex

我爱上了 Regex,但有一件“简单”的事情我做不到。我已经为此苦苦挣扎了一段时间(这很有趣!),所以我认为一些帮助会非常甜蜜。感谢您已阅读此请求!

我有以下字符串,我想匹配它的某些部分:

this is cool--this is nice--this-is-it

我想要一个能返回三个匹配项的正则表达式,就是它们:

this is cool

this is nice

this-is-it

我正在尝试匹配由双破折号 (--) 分隔的任何文本,但是,应将单破折号视为任何其他字符。到目前为止,我已经尝试了一些东西,但我越接近这个正则表达式:/[^(--)]+/gm。该正则表达式当前返回 5 个匹配项,可以在此处可视化:

https://regex101.com/r/W58b5W/1

谢谢!

2 个答案:

答案 0 :(得分:2)

[^(--)] 并不代表您认为的意思。 [...] 内的任何内容只匹配一个字符,因此 [^...] 不能排除任何组合超过 1 个字符。

您需要的是 negative lookaroundscontrol verbs

对于您的具体情况(假设连续不超过 2 个 --- 出现在字符串的开头或结尾),您只需要匹配两者之间的任何内容-- 或者字符串的开头和结尾,所以可以写成

(?<=--|^).*?(?=--|$)
  • (?<=--|^) 正向后视,确保匹配的开头是 -- 或字符串的开头。
  • .+? 匹配尽可能少的任何字符。
  • (?=--|$) 正向前瞻,确保匹配的结尾是 -- 或字符串的结尾

检查the test cases


但是注意一些正则表达式引擎,比如 Safari 使用的不支持lookbehinds,所以你需要使lookbehind真正匹配

(?:--|^)(.*?)(?=--|$)

然后就可以得到第1组的结果了。

答案 1 :(得分:1)

(.+?)(?:--|$)

既然您似乎想使用正则表达式来拆分字符串,那么尝试查找以 -- 或字符串结尾 ($) 结尾的所有字符串长度如何。这些将为您提供与您应该能够访问的第一个捕获组中所需字符串的所有匹配项的列表。

但是,如果您只需要通过单个分隔符(即 --)分割字符串,您应该使用您的编程语言字符串分割能力。如果您需要使用多个分隔符(例如 --||::)进行拆分,则 Regex 在这种情况下很有用