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

4

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

所以我需要匹配两个花括号 {} 之间的所有内容,但是不包括以 @ 开头且没有这些花括号的情况,例如:

  1. "这是一个超文本 {match_this}"
  2. "{match_this}"
  3. "这是另一个例子 @{deal_with_it}"

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

  1   {eww}
  2   r23r23{fetwe}
  3   #{d2dded}
  4   @{d2dded}

我正在尝试使用以下内容:

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

接着只有第二个和第三个选项匹配成功了(不包括第一个选项)https://regex101.com/r/qRInUf/2/

然后我试着:

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

在这两种情况下,我都无法匹配1,2,3的值。 https://regex101.com/r/uYRtLD/1 提前感谢任何建议。
编辑:这是针对Java的。

你是想匹配{前面的字符还是只匹配{x}这部分? - ctwheels
@ctwheels 它可以工作,但在2(r23r23 {text})中它会创建两个组。是否有一个选项只创建一个组? - Panczo
1
所以你只想匹配大括号 {} 内的内容吗? - ctwheels
我试图只匹配它的x部分。 - Panczo
1
明白了,那么(?<=(?<!@){)([^}]*)(?=})是什么意思? - ctwheels
显示剩余4条评论
2个回答

6

点此查看正则表达式使用示例

(?<=(?<!@)\{)[^}]*(?=})
  • (?<=(?<!@)\{) 正向后瞻,确保前面的内容与以下内容匹配
    • (?<!@) 负向后瞻,确保前面的内容不是字面上的@
    • \{ 字面上匹配字符{
  • [^}]* 匹配除了}之外的任何字符,任意次数
  • (?=}) 正向前瞻,确保后面的内容是字面上的}

结果:

{eww}           # Matches eww
r23r23{fetwe}   # Matches fetwe
#{d2dded}       # Matches d2dded
@{d2dded}       # Does not match this because @ precedes {

3
请使用以下正则表达式:
(?<!@\{)(?<=\{).*?(?=\})

使用负回顾后断言来确保没有@{,使用正回顾后断言来确保有{,使用正前瞻断言来确保有}

在此处尝试在线匹配这里


2
如果同一字符串中存在两个 {},则 .* 将会给出错误的结果。可以在此处查看其工作不正确的示例:https://regex101.com/r/ig9rrW/2 - ctwheels
1
@ctwheels 感谢您指出这一点。已更改为 .*?。https://regex101.com/r/5gA4Ji/1 - O.O.Balance

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接