正则表达式匹配两个 之间的所有内容

Posted

技术标签:

【中文标题】正则表达式匹配两个 之间的所有内容【英文标题】:Regex match everything between two 正则表达式匹配两个 之间的所有内容 【发布时间】:2018-09-02 07:34:27 【问题描述】:

我在这里查看了不同的答案,但不幸的是,它们都不适合我的情况。所以我希望你不要介意。

所以我需要匹配两个大括号 之间的所有内容,除非匹配以 @ 开头并且没有这些大括号,例如:

    “这是一个超级文本 ma​​tch_this” “ma​​tch_this” “这是另一个例子@deal_with_it”

这是我的测试字符串,1,2,3 是有效的,而最后一个不应该是:

  1   eww
  2   r23r23fetwe
  3   #d2dded
  4   @d2dded

我正在尝试:

(?<=[^@]\)[^\]*(?=\)

那么只有第二个和第三个选项是匹配的(没有第一个) https://regex101.com/r/qRInUf/2/

然后我在尝试:

\(.*?)\ or [^@]\(.*?)\

在这两种情况下,我都无法匹配 1,2,3 值 https://regex101.com/r/uYRtLD/1

提前感谢您的任何建议。

编辑:这是针对 java 的。

【问题讨论】:

这是一个java .?(?&lt;!@)\([^]*) 呢? 您是要匹配 前面的字符还是只匹配x 部分? 所以你只想匹配里面的内容? 知道了,那么(?&lt;=(?&lt;!@))([^]*)(?=) 呢? 【参考方案1】:

See regex in use here

(?<=(?<!@)\)[^]*(?=)
(?&lt;=(?&lt;!@)\) 积极的向后看,确保前面的内容与以下内容匹配 (?&lt;!@) 否定后视确保前面的内容与 @ 字面意思不匹配 \ 匹配 字面意思。 [^]* 匹配除 之外的任何字符任意次数 (?=) 积极的前瞻确保接下来是 字面意思

结果:

eww           # Matches eww
r23r23fetwe   # Matches fetwe
#d2dded       # Matches d2dded
@d2dded       # Does not match this because @ precedes 

【讨论】:

【参考方案2】:

使用这个正则表达式:

(?<!@\)(?<=\).*?(?=\)

一个否定的lookbehind保证没有@,一个肯定的lookbehind保证一个,一个肯定的lookbehind保证一个

在线试用here。

【讨论】:

如果两个 存在于同一字符串中,.* 将给出不正确的结果。看到它工作不正常here @ctwheels 感谢您指出这一点。更改为.*?。 regex101.com/r/5gA4Ji/1

以上是关于正则表达式匹配两个 之间的所有内容的主要内容,如果未能解决你的问题,请参考以下文章

C正则表达式,匹配两个字符串之间的内容

js正则表达式 匹配两个特定字符间的内容

php 正则表达式 匹配网站内容

两个字符串之间的正则表达式匹配,包括那些字符串

正则表达式匹配两个字符串之间的所有字符

正则表达式 - 匹配 BEGIN 和 END 之间的所有内容