2013-12-22 3 views
6

Я бы подумал, что эта проблема невозможна; насколько я знаю, JREQUEX-regex-аромат имеет более рекурсивную интерполяцию или отличную функцию балансировки .NET. Тем не менее, это так, как проблема 12 на regex.alf.nu: сопоставить сбалансированные пары < и >. Если в наборах, которые я не получаю, есть какая-то другая модель.Как сопоставить сбалансированные разделители в javascript regex?

Итак ... это возможно? Если да, то как?

ПРИМЕЧАНИЯ:

  1. Я знаю, что это невозможно для истинных регулярных выражений, но основываясь на вызов, кажется, что это должно быть возможно в аромате JavaScript (который, по крайней мере достаточно нерегулярный иметь обратные_связи). Я просто не знаю ни одной функции, которая позволила бы им это сделать.

  2. Никакой другой код - форма позволяет вводить одно регулярное выражение, которое оценивается по тестовым строкам на странице. Я мог бы попытаться взломать страницу, чтобы вырваться из регулярного выражения и в сырой JS, я полагаю, но это, похоже, не в духе этой проблемы.

С тех пор как Дэвид спросил, вот тестовые строки. Более длинные были усечены с количеством символов, но проблема называется «Баланс», а те, которые являются полными, безусловно подтверждают гипотезу о том, что столбец «match» имеет сбалансированные пары < и >, в то время как столбец «нет» ,

Match all of these… 

<<<<<>><<>>><<... [62 chars] 
<<<<<>><>><<><... [110 chars] 
<<<<<>><>><>><... [102 chars] 
<<<<<>><>>>><<... [88 chars] 
<<<<<>>><<<>><... [58 chars] 
<<<<<>>><<><>>... [152 chars] 
<<<<<>>><<>><<... [42 chars] 
<<<<<>>><>><<<>>>><<>> 
<<<<<>>>><<<<>... [102 chars] 
<<<<<>>>><<<><... [30 chars] 
<<<<<>>>><><<<... [66 chars] 
<<<<<>>>><><<<... [124 chars] 
<<<<<>>>><>><<>> 
<<<<><<>>><<<>... [34 chars] 
<<<<>><<<>>>><... [92 chars] 
<<<<>>><<<<>><>><<<>>>>> 
<<<<>>><<<><<>>><><<>>>><<>> 
<<<<>>><<><<<>... [84 chars] 
<<<<>>>><<<><<... [52 chars] 
<<<><<<>>>><<<... [50 chars] 
<<<><<><>>>> 
<<<><>><<<>>>> 
<<<>><<<><<>>>... [44 chars] 
<<<>><><<<><>>... [48 chars] 
<<<>>><<><<<<>>>><<><<<>>>>> 
<<><<<<>><>>>>... [60 chars] 
<<>> 
<<>><<<<<>>>>>... [54 chars] 
<<>><<<<>><<<>... [74 chars] 
<> 
<><> 

and none of these… 

< 
<<<<<<>>><<><>>>>>><<> 
<<<<<>>><>>><<<>>>><>> 
<<<<<>>>>>> 
<<<<>><<<<<><<>><><<<< 
<<<>><<<<><><><>< 
<<<>>>><><<<><> 
<<><<<<><<><<>>><< 
<<><<<>>>>><< 
<<>>><<<>> 
<><<<>><<>>><<> 
<><<>>><<<><>><<<>>><<>>>>< 
<><<>>><><<<> 
<><>><>>><><<<... [36 chars] 
<>><><<<><> 
<>>>>>><<<>><<>><>< 
<>>>>>>><<< 
> 
>< 
><<<>><><<<><< 
><<<>>>><><<<<><>>><<><><< 
><<><<<<><<<<>>>>< 
><><><<<>>>>> 
><><>>><>><> 
><><>>>><>>>>>>><>>><>> 
><>><<<<<>> 
><>><><><<>><<>>><< 
><>>><>>>>><<><<<><>><>><<< 
>><<<><<<<<<><>><< 
>><>>><<<><>>><><<>><<><><< 
>>>><>><>>>><>>><>><>< 
>>>>><<<>>> 
+1

Разрешено ли вам использовать другой код JavaScript? Если это так, просто реализуйте стек совпадений «начать», а затем разматывайте их, когда найдете совпадения «конец». –

+1

Язык, который вы описываете, не является регулярным. –

+0

Как насчет того, чтобы вы вставляли в свой вопрос набор [matche these] & [but not these]? –

ответ

6

Я не верю, что это возможно в JavaScript, хотя это трудно доказать. Например, Java и PHP не имеют упомянутых функций (рекурсивная интерполяция, балансировочные группы), но this fascinating Stack Overflow answer показывает, как сопоставить anbn с использованием регулярных выражений на этих языках. ( Адаптирование, что ответ на настоящий случай Java регулярное выражение ^(?:(?:<(?=<*(\1?+>)))+\1)*$ должно работатьИсправление:. нет, это не так легко адаптируются.) Но что ответ зависит от поддержки в Java для притяжательных квантора ?+ (как ? за исключением того, вы не можете вернуться в него), и JavaScript этого не имеет.

Тем не менее, вы можете решить эту головоломку ссылки написав это:

^(?:<(?:<(?:<(?:<(?:<(?:<(?:<>)*>)*>)*>)*>)*>)*>)*$ 

, который соответствует до семи уровней вложенности. Это самое лучшее, что есть у любой из строк, так что это все, что вам нужно. (Некоторые из других головоломок на этой странице советуют вам обманывать, потому что они просят что-то технически невозможно, поэтому, хотя элегантное решение, очевидно, будет более привлекательным, нет оснований предполагать, что он существует.)

+0

Хороший вопрос об обмане. –

+0

Я прочитал исходный код страницы, и все, что он проверяет, - это регулярное выражение. Как вы уже сказали, ничто не говорит о том, что существует более элегантный ответ, и он не получит высшие баллы. – Rhyono

+0

Java также не может выполнить скобки. Нам нужен рекурсивный синтаксис regex (подпрограмма), который Java не поддерживает (AFAIK). – nhahtdh

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