1

所以假设我有这个

example: 1
[
   this shouldn't be matched
]
example : 2 
[
   some bla
   [
      other bla
   ]

]

我注意检查文件是否有任何嵌套括号。我不想实际检查括号是否匹配我只需要查看它们是否存在。

现在在我的脑海里,这听起来很简单,但我无法摆脱它(就正则表达式而言)

所以我想出了一些东西(希望是扫描仪),它只是一个简单的 javascrpit 函数。

function idNested(str){
    // match all brackets
    var g = str.match(/[\[\]]/g);
    // join them into one string
    var b = g.join('');
    // match double bracket if there is any , it means that there is nesting :)
    return b.match(/\[\[/) ? true : false;
}

第一个正则表达式获取所有括号。然后我将它们加入一个大字符串并搜索两个彼此跟随的括号。

所以我的问题实际上基于两件事。

1 - 是否有正则表达式可以解决我的问题?!

2-这个功能有什么缺点吗?如果是这样,请提出其他建议。

4

2 回答 2

2

为什么不检查这个:

\[              # Match an open bracket
[^\]]*?         # Match zero or more non-closing bracket ] lazily
\[              # Match another opening bracket
[^\]]*          # Match zero or more non-closing bracket ] greedily
\]              # Match a closing bracket.

它的工作原理是这样的,如果我们匹配了一个开括号[,那么我们会寻找另一个开括号[,并确保我们不会越过一个右括号]

如果上述表达式匹配,则文本中有嵌套。

var isNested = '[f daflkd [hfds ] fdaf d[ [] fd'.match(/\[[^\]]*?\[[^\]]*\]/g);

注意:这假定文件不包含不适当的嵌套括号。

正则表达式 101 演示

于 2013-10-03T21:21:59.217 回答
2

回答2:

不,如果您的括号嵌套正确,这不应该有任何失败。

本质上,您正在将字符串缩减为仅其括号。在您的情况下,字符串将变为[][[]].

假设我们一次处理字符串 2 个字符。只有 4 种可能的组合:

  1. [[我们找到了一个嵌套括号,并且我们完成了匹配,因为字符串的其余部分必须有这些括号(例如[[]])。
  2. []我们找到了一组括号,忽略这个结果,然后继续。
  3. ][这永远不会发生,因为这意味着我们要么已经匹配了1(例如[[][...)并且我们完成了算法,要么您有无效的括号嵌套(例如[]][)。
  4. ]]如果括号嵌套正确,我们已经找到了1,因此永远不会达到这种状态。

因此,您的算法将起作用。

答案一:

话虽如此,使用单个正则表达式的代码会简单得多(假设嵌套正确):

str.match(/\[[^\]]*\[/)

将匹配的字符串:

  • [[]]
  • [[[]]]
  • [][[]]

不匹配的字符串:

  • [][]
  • []

我们不关心的字符串(因为它们没有正确嵌套):

  • [[
  • ][[
  • [[[]]
于 2013-10-03T21:38:50.653 回答