2009-08-12 2 views
0

Можно ли преобразовать правильно сформирован (в терминах скобках) выражения, такие какИспользование регулярных выражений для оценки поискового запроса

((а и б) или в) и г

в выражение Regex и использовать Java или встроенный движок другого языка с входным термином, таким как ABCDE (без учета регистра ...)?

До сих пор я пробовал что-то по строкам (b) (^.?) (a | e) * для поиска b и (a или e), но на самом деле это не работает. Я ищу его в соответствии с символами «b» и любыми «a» или «e», которые появляются во входной строке.

О процессе - Я думаю о разделении входной строки на массив (на основе этого регулярного выражения) и получении в качестве вывода символов, которые соответствуют (или нет, если условия И/ИЛИ не выполняются). Я относительно новичок в Regex и не потратил на это много времени, поэтому мне жаль, что то, о чем я прошу, невозможно, или ответ действительно очевиден.

Спасибо за любые ответы.

+0

Это типичный случай для анализатора: подсчет открывающей и закрывающей круглых скобок. – Gumbo

+0

Отредактировал вопрос на примере подхода, о котором я думал. – raptors

+0

Я решил пойти с более традиционным рекурсивным поиском строк, как это рекомендовано ниже. Я надеялся, что будет простой способ регулярного выражения, но можно только надеяться ... Спасибо за быстрые ответы. – raptors

ответ

1

Язык строк со сбалансированными круглыми скобками не является обычным языком, что означает, что нет (чистое) регулярное выражение будет соответствовать ему.

Это потому, что для поддержания открытых круглых скобок необходима какая-то конструкция памяти, обычно это стек.

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

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

С другой стороны, я не совсем уверен, что понимаю, что вы делаете. Прошу прощения, если это не поможет.

+0

Я пытался получить рекурсивное решение, используя обычный метод сравнения строк, прежде чем отправлять его здесь, но я подумал, что, возможно, будет простой способ использования Regex. Спасибо за предложения. – raptors

0

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

1

Я не совсем уверен, что понимаю, что вы пытаетесь сделать, но вот что-то, что может помочь. Начните с чем-то вроде

 
((a and b) or c) and d 

И пройти через эти заявления замещения:

 
s/or/|/g 
s/and| //g 
s/([^()|])/(?=.*$1)/g 

Это даст вам

 
(((?=.*a)(?=.*b))|(?=.*c))(?=.*d) 

который является регулярное выражение, которое будет соответствовать тому, что вы хотите.

+0

Я не мог заставить это работать на ABCD с онлайн-тестером, например http://regexpal.com/. Спасибо, но я решил пойти с более традиционным рекурсивным методом поиска String, как было рекомендовано выше. – raptors

+0

К сожалению, существуют различные ароматы двигателя регулярных выражений. Материал (? = Foo) - это «lookahead», который Perl может обрабатывать, но, видимо, regexpal не может. Я не знаю, что вы используете, но мой подход работает под Perl и, согласно regextester, Javascript. – Beta

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