匹配两到三个花括号中间的单词的正则表达式

4
我正在Kotlin应用程序中编写正则表达式,以匹配以下情况:用户将发送类似以下的字符串:
 1. "{{example}}" -> match: example 
 2. "{{{example2}}}" -> match: example2
 3. "{{example3}}}" -> do not match 
 4. "{example4}" -> do not match
 5. "{{{example5}}" -> do not match 
 6. "{{{{example6}}}}" -> do not match 
 7. "{{ example7 }}  some other words {{{example8}}}" -> match: example7 and example8 
 8. "{{{example9}}} some other words {{example10}} {{example11}}" -> match: example9, example10 and example 11

因此,要匹配两个或恰好三个花括号之间的单词。这是我接近结果的方法:

regex = \{{2}([^{^}]+)\}{2}([^}])|\{{3}([^{^}]+)\}{3}([^}])

这个正则表达式可以匹配除了example5以外的所有内容,你也可以在这里查看 https://regex101.com/r/M0kw3j/1


@TimBiegeleisen,这个方法可行,但你需要将 .*? 替换为 [^\{\}]*,以排除 {{exam}ple}} — 即 (?<!\{)(?:\{\{[^\{\}]*\}\}|\{\{\{[^\{\}]*\}\}\})(?!\})。我认为示例4没有任何问题。 - Amadan
2个回答

5

使用交替和lookaround,您可以使用以下正则表达式:

(?<!\{)(\{{3}[^{}\n]*}{3}|\{{2}[^{}\n]*}{2})(?!})

正则表达式演示更新

RegEx 详情:

  • (?<!\{): 负向先行断言,确保前一位置不是 {
  • (: 开始捕获组 #1
    • \{{3}: 匹配 3 个开头的 {{{
    • [^{}\n]*: 匹配0或多个非 {} 的任意字符
    • }{3}: 匹配 3 个结尾的 }}}
    • |: 或者 (分支结构)
    • \{{2}: 匹配 2 个开头的 {{
    • [^{}\n]*: 匹配0或多个非 {} 的任意字符
    • }{2}: 匹配 2 个结尾的 }}
  • ): 关闭捕获组 #1
  • (?!}): 负向后行断言,确保下一位置不是 }

5

这里有一些可能对你有用的东西:

(?<!\{)\{\{(?:([^{}]+)|\{([^{}]+)})}}(?!})

查看在线演示

  • 恰好在 2 对花括号之间的单词将在第 1 组里。
  • 恰好在 3 对花括号之间的单词将在第 2 组里。

  • (?<!\{) - 否定回顾,匹配没有开花括号的位置。
  • \{\{ - 匹配两个字符等于双重左大括号。
  • (?: - 开始非捕获组。
    • ([^{}]+) - 第一个捕获组,匹配一对以上的不含括号的字符。
    • | - 或者:
    • \{([^{}]+)} - 第二个捕获组,在开头和结尾有括号。
    • ) - 结束非捕获组。
  • }} - 匹配两个字符等于双重右大括号。
  • (?!}) - 否定前瞻,匹配没有闭合花括号的位置。

我知道演示需要正则表达式,但是你可能需要注意,如果它在Java中使用,所有的\都必须被转义。 - Scratte

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