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

时间:2015-05-05 12:48:44

标签: javascript regex conditional-operator

在JavaScript中希望能够匹配以下文本:

  • (被括号)
  • 包围
  • [被方括号]
  • 包围
  • 未被任何类型的支架包围

在以下表达式中......

none[square](round)(accept]able)[wrong).text

...对于none[square](round)(accept]able),应该有4个匹配项。但是[wrong)不匹配,因为找不到关闭]

my best attempt so far ...

([([])[A-Za-z]+[\])]|[^\[()\]]+

... (accept]able[wrong)未正确匹配,而(accept]able)整体不匹配。我并不太关心(accept]able);我宁愿根本不匹配与不平衡的括号匹配。

我猜我需要将[\])]表达式替换为检查初始匹配组值的表达式,并在第一个匹配项为)或{{(时使用] 1}}如果第一场比赛是[

我尝试过使用conditional expressions。这些似乎在PCRE和Python中运行良好,但是not in JavaScript

这是一个可以在JavaScript正则表达式中单独解决的问题,还是我必须在庞大的JavaScript函数中处理这个零碎的问题?

4 个答案:

答案 0 :(得分:1)

这样做的方法是匹配两种情况(可接受和不可接受)并将结果分成两个不同的捕获组。因此,无论您需要对结果做什么,您只需要测试哪个组成功:

/(\[[^\]]*\]|\([^)]*\)|[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
)

注意这两种模式:您可以在找到未闭合的括号时选择默认行为。这两种模式设计用于在第一个闭合括号处停止不可接受的部分,或者如果在字符串的末尾没有找到,但是您可以更改此行为并选择一个非闭合括号始终停止在字符串的末尾,如下所示:[\[(][\s\S]*$

答案 1 :(得分:0)

我不太确定我是否获得了所有可能的字符串,但也许这样做可以解决问题?

/\[([A-Za-z]*)\]|\(([\]A-Za-z]*)\)/gm

答案 2 :(得分:0)

您可以使用以下内容:

/^(\[[^\[]+?\]|\([^\(]+?\)|[^\[\(]+)$/gm

请参阅DEMO

答案 3 :(得分:0)

这将为你做到:

\((\w*\s*)\)|\[(\w*)\]|\((\w*\s*|\])*\)|\((\w*\s*|\[)*\)|\[(\w*\s*|\()*\]|\[(\w*\s*|\))*\]|^\b\w*\s*\b

在这里演示:

https://regex101.com/r/mV6gD2/2