JavaScript 正则表达式来记住遇到的最后一个括号类型

标签 javascript regex conditional-operator

在 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/

相关文章:

python - Python 中的命名反向引用 (?P=name) 问题重新

c# - 正则表达式 - 避免字符

c# - 为什么以下条件运算符在包含 Nullable 类型的 StringBuilder 中运行异常?在 C# 中?

java - 类型不匹配 : cannot convert from Object to K when using conditional operator

javascript - javascript 在模糊表单验证方面遇到问题

javascript - 创建动态元素和 document.write

javascript - 如何使用本地存储将我的输入框值存储到另一个输入框

javascript - NodeJS 将响应输出返回到对象数组

Python 正则表达式 : Multiple matches in one line (using findall())

javascript - React useState 不适用于条件运算符