鉴于foo bar monkey [foo bar monkey] foo bar monkey
,您如何仅匹配括号内的bar
?
\[(bar)+\]
尽可能接近我从理解和研究的角度来看(括号是匹配的,然后我们只选择括号中的确切文本1次或更多次)但是它不匹配任何东西我想要它。 \[(.*)+\]
匹配括号中的所有内容,包括括号,但无论我尝试什么,我似乎无法将其过滤为bar
。
编辑:我在JetBrains IDE中使用目录功能替换。我不确定他们用什么语言来处理正则表达式。
答案 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
。
答案 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作为测试)
答案 2 :(得分:0)
你可能会相处
\[(?:(?!]).)*?bar
<小时/>
那是
\[ # 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)