2013-10-03 3 views
1

так скажем, у меня есть этотматч два открытых скобок

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

] 

я наблюдал, чтобы проверить, если файл имеет какие-либо вложенные скобки. Я не хочу проверять, соответствуют ли скобки, мне нужно только увидеть, существуют ли они.

сейчас в моей голове этот звук простой, но я не мог получить NAY вещь из-за этого (в терминах регулярных выражений)

так я придумал что-то (сканер, надеюсь), который является всего лишь простая функция 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

попытка/\\ [[^ \\]] + \\ [/ г – 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. 

как это работает, если соответствует открытому Brack [, то мы ищем другое открытие кронштейне [, и мы уверены, что мы не пересекались закрывающий кронштейн ].

Если указанное выражение соответствует, в тексте есть вложенность.

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

Примечание: Это предполагает, файл не содержит неприличия вложенные скобки.

Regex101 Demo

+0

Не совсем, '[[' 'не вложенные скобки. – sln

+0

@sln Благодарим за то, что вы указали это, можете ли вы прокомментировать обновленное решение. –

+0

Я думаю, что вы на правильном пути, может быть, единственный способ узнать, это получить два набора '\ [. *? \ [. *? \]. *? \]' – sln

Смежные вопросы