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

时间:2018-03-23 15:06:39

标签: java regex regex-negation regex-lookarounds regex-group

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

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

  1. "这是超级文字{ match_this }"
  2. " {的 match_this }"
  3. "这是另一个例子@ {deal_with_it}"
  4. 以下是我的测试字符串,1,2,3有效,而最后一个不应该是:

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

    我正在尝试:

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

    然后只有第2和第3个选项匹配(没有第一个) https://regex101.com/r/qRInUf/2/

    然后我在尝试:

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

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

    提前感谢任何建议。

    编辑:这是针对java。

2 个答案:

答案 0 :(得分:6)

See regex in use here

(?<=(?<!@)\{)[^}]*(?=})
  • (?<=(?<!@)\{)正向后视确保先于下列内容匹配的内容
    • (?<!@)负面的背后隐藏,确保先前不会匹配@字面上
    • \{按字面意思匹配{
  • [^}]*匹配除}以外的任何字符
  • (?=})确保以下内容的正向前瞻}字面意思

结果:

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

答案 1 :(得分:3)

使用此正则表达式:

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

负面观察,以确保没有@{,确保{的正面观察和确保}的正向前瞻。

在线试用here