正则表达式匹配包含其他字符的括号内的字符集

时间:2018-02-20 16:51:02

标签: regex

鉴于foo bar monkey [foo bar monkey] foo bar monkey,您如何仅匹配括号内的bar

\[(bar)+\]尽可能接近我从理解和研究的角度来看(括号是匹配的,然后我们只选择括号中的确切文本1次或更多次)但是它不匹配任何东西我想要它。 \[(.*)+\]匹配括号中的所有内容,包括括号,但无论我尝试什么,我似乎无法将其过滤为bar

编辑:我在JetBrains IDE中使用目录功能替换。我不确定他们用什么语言来处理正则表达式。

5 个答案:

答案 0 :(得分:1)

要匹配括号内的任何bar(通过知道不可能发生不平衡括号),您可以使用以下正则表达式:

bar(?=[^\]\[\\]*(?:\\.[^\]\[\\]*)*\])

RegEx细分

bar     # Match `bar`
(?=     # Starting a positive lookahead, works as If condition
    [^\]\[\\]*  # If without matching `]` or `[` or `\`
    (?: # Start of non-capturing group #1
        \\.[^\]\[\\]* # Repeat last pattern in addition to matching escaped chars
    )*  # Many times, end of NCG #1
    \]  # When it ends to `]`
)       # End of lookahead

在这样的字符串上运行:

foo bar monkey [foo bar monkey bar foo] foo bar monkey [foo bar monkey bar foo]

将匹配括号内的所有bar。您可能希望将其与\b括起来,以确保仅匹配bar字词:\bbar\b

Live demo

答案 1 :(得分:0)

JetBrains的' IDE是用Java 1.4编写的(包括Java 1.4&#regex引擎)。有多种方法可以完成您尝试做的事情,但最简单的方法可能是不使用捕获组。只要您不使用+*量词,Java就支持可变长度的lookbehinds。作为这些不受支持的量词的替换,您可以使用{0,1000}之类的内容替换*{1,1000}来替换+

(?<=\[[^]]{0,1000})bar
  • (?<=\[[^]]{0,1000})正向后视确保先于下列内容匹配的内容
    • \[按字面意思匹配[
    • [^]]{0,1000}匹配除]之外的任何字符0至1000次
  • bar按字面意思匹配

运行此正则表达式为我产生以下结果(使用PHPStorm作为测试)

enter image description here

答案 2 :(得分:0)

你可能会相处

\[(?:(?!]).)*?bar

a demo on regex101.com

<小时/> 那是

\[         # match [
(?:        # non-capturing group
    (?!]). # neg. lookahead forbidding ]
)*?        # as few as possible
bar        # match bar

捕获 bar,您可以使用

\[(?:(?!]).)*?(bar)

并使用第一组。

答案 3 :(得分:-1)

尝试

.*\[[^]]*?(bar)[^[]*?\].*

只要它在某些括号内,它应该捕获bar。需要[^]]*?每一侧的[^[]*? / (bar)来使用bar括号内的其他内容。

请注意,这将无法正确处理嵌套括号,并且只会找到一个bar以及许多其他限制。

答案 4 :(得分:-1)

检查一下。它工作正常。

\[\w*\s(bar)\s\w+\]

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