2013-10-09 1 views
0

Мы столкнулись с некоторыми проблемами с этим регулярным выражением.Регулярное регулярное выражение имеет небольшую ошибку

/\(\((((?>[^\(\(\)\)]+)|(?R))*)\)\)/x 

Используется для «вращения» текстов. Когда у нас есть предложение типа «((Мы ((люблю | как)) эту рубашку (размер xl))), то он не может выполнить это право. Из-за трех скобок в конце предложения (потому что первая из последних трех скобок в конце принадлежит самому тексту).

Как это должно работать: регулярное выражение должно получить первые 2 круглые скобки, если оно имеет 3 или более в начале, в конце последних 2, когда в конце есть 3 или более круглых скобок. Это возможно???

Имейте в виду, что он отлично работает на многоуровневом уровне, поэтому что-то вроде «((этот (рубашка свитер))))« хорошо работает (см. 4 круглых скобки в конце?). Таким образом, это происходит не так, когда скобки, которые принадлежат В тексте, начинаются прямо за стартовыми скобками для вращения ИЛИ заканчиваются прямо перед конечными скобками.

ответ

1

Ну, во-первых, вам не нужно избегать круглых скобок внутри классов символов, и не более полезно ставить более одного раза один и тот же символ в классе символов; Таким образом, ваше регулярное выражение может стать, как это без каких-либо изменений в функциональности:

\(\((((?>[^()]+)|(?R))*)\)\) 

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

При этом, вы можете разрешить вложенные одиночные строки скобок в регулярном выражении, включив еще одну возможности в внутреннем захвате регулярного выражения в:

\(\(((?:[^()]|((?R))|(\((?:[^()]|(?3))*\)))*)\)\) 
    1   2  3 

Захват группа:
1 - получает первый большой матч между крайним ((...))
2 - получает внутренние совпадения и больше вложенные ((...))
3 - получает содержимое между одиночными парсерами, так что рекурсия разрешена и в этой группе. Если вам это не нужно, просто игнорируйте его в массиве, это просто, чтобы разрешить вложенные одиночные парсеры.

regex101 demo

+0

Вы мой герой! Последнее регулярное выражение ('\ (\ (((:: [^()] | ((? R)) | (\ ((?: [^()] | (? 3)) *))) *) \) \) '), работает как шарм !!!! –

+0

@ ErikVandeVen Я просто попытался помочь ^^; Я рад, что это сработало для вас :) – Jerry

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

  • Нет связанных вопросов^_^