匹配两个左括号

match two open brackets

本文关键字:两个      更新时间:2023-09-26

假设我有这个

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-此功能是否有任何缺点? 如果是这样,那么请提出其他建议。

回答数字 2:

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

从本质上讲,您将字符串减少到仅其括号。在您的情况下,字符串将变为 [][[]]

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

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

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

答案 1:

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

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

将匹配的字符串:

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

不匹配的字符串:

  • [][]
  • []

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

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

为什么不检查一下:

'[              # 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 演示