2013-10-03 60 views
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-這個函數有什麼不足嗎?如果是的話,請提出其他建議。

+3

的try/\\ [^ \\] + \\ [/ G – dandavis

+0

,這裏是我的/ \\ [^ \\] *? \\ [/ g – Darka

+0

它沒有任何意義,因爲如果不想匹配括號,則看不到它們是否存在。否則,它的隨機存在可能是'^(?=。* \ [。* \ [](?=。* \]。* \])' – sln

回答

2

回答數2:

不,這應該不會有什麼挫折,如果你的括號正確嵌套。

基本上,你正在將一個字符串縮小到只有其括號。在你的情況下,字符串將變成[][[]]

假設我們一次處理字符串2個字符。只有4個可能的組合:

  1. [[我們發現嵌套支架,我們正在與匹配完成,由於字符串的其餘部分必須有閉括號內爲這些(例如[[]])。
  2. []我們找到了一組括號,忽略這個結果,然後繼續。
  3. ][這可能永遠不會發生,因爲這意味着我們要麼已經匹配(例如[[][...),我們用算法來實現,或者你有無效的支架嵌套(例如[]][)。
  4. ]]我們已經發現如果方括號嵌套正確,從而永遠不會達到此狀態。

因此,你的算法將工作。

應答數1:

話雖如此,該代碼將與一個正則表達式簡單得多(假設正確嵌套):將被匹配

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

字符串:

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

字符串將不匹配:

  • [][]
  • []

我們不關心(因爲它們無法正常字符串嵌套):

  • [[
  • ][[
  • [[[]]
+0

問題是關於嵌套,假設是無關緊要的。也可以匹配兩個開頭括號'\ [。* \ ['。這是同一件事。 – sln

+0

@sln:那個正則表達式匹配'[] []',而我發佈的則不匹配。你可能會說我的''[''會失敗,但根據OP,這個字符串永遠不會存在。另一方面,'[] []'是一個將存在的字符串(因爲方括號嵌套正確)。因此,我們需要一個匹配'[[]]'的正則表達式,但不匹配'[] []',例如。 '[[''是無關的,因爲它永遠不會傳遞給這個正則表達式。 – Senseful

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); 

注:這假定該文件不包含不當嵌套括號。

Regex101 Demo

+0

不是,'[['不是嵌套支架。 – sln

+0

@sln謝謝你指出,你可以評論更新的解決方案。 –

+0

我認爲你在正確的軌道上,也許唯一的方法就是得到兩套'\ [。*?\ [。*?\]。*?\]' – sln