在 JavaScript 中希望能够匹配以下文本:
(
用括号括起来)
[
用方括号括起来]
- 没有被任何类型的括号包围
在下面的表达式中...
none[square](round)(accept]able)[wrong).text
...应该有 4 个匹配项,分别为 none
、[square]
、(round)
和 (accept]能够)
。但是 [wrong)
不应匹配,因为找不到结束 ]
。
在 my best attempt so far ...
([([])[A-Za-z]+[\])]|[^\[()\]]+
... (accept]
、able
和 [wrong)
匹配不正确,而 (accept]able)
整体不匹配。我不太关心(accept]able)
;我宁愿没有任何匹配,也不愿进行不平衡括号的匹配。
我猜测我需要将 [\])]
表达式替换为检查初始匹配组的值的表达式,并使用 )
如果第一个如果第一个匹配是 [
,则匹配为 (
或 ]
。
我尝试过使用conditional expressions 。这些似乎在 PCRE 和 Python 中运行良好,但是 not in JavaScript .
这是一个可以在 JavaScript 正则表达式中单独解决的问题,还是我必须在庞大的 JavaScript 函数中处理这个零散的问题?
最佳答案
一种方法是匹配两种情况(可接受和 Not Acceptable )并将结果分为两个不同的捕获组。因此,无论您需要对结果做什么,您只需测试哪一组成功:
/(\[[^\]]*\]|\([^)]*\)|[a-z]+)|([\[(][\s\S]*?(?:[\])]|$))/gi
图案详细信息:
( # acceptable capture group
\[ [^\]]* \]
|
\( [^)]* \)
|
[a-z]+
)
|
( # non-acceptable capture group
[\[(] [\s\S]*? (?: [\])] | $ ) # unclosed parens
)
此模式并不关心方括号是否包含在圆括号之间,反之亦然,但您可以轻松地使用此模式更加严格,禁止方括号(方括号或圆括号)之间存在任何其他方括号:
( # acceptable capture group
\[ [^()\[\]]* \]
|
\( [^()\[\]]* \)
|
[a-z]+
)
|
( # non-acceptable capture group
[\[(] [\s\S]*? (?: [\])] | $ ) # unclosed parens
)
关于这两种模式的注意事项:当发现未闭合的括号时,您可以选择默认行为。这两种模式旨在在第一个右括号处停止 Not Acceptable 部分,或者如果在字符串末尾找不到 Not Acceptable 部分,但您可以更改此行为并选择非右括号始终停止在字符串末尾,如下所示: [\[(][\s\S]*$
关于JavaScript 正则表达式来记住遇到的最后一个括号类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30053444/