2017-02-13 18 views
-2

Я пишу программу для распознавания действительных (как определено пользователем) выражений, и мне нужно уметь сопоставлять количество совпадений определенного символа в одна часть с другой. Например, если я использую PQ систему, вЯдро regex соответствует количеству раз подстрока/char появляется в строке

(some number of dashes)p-q(some number of dashes) 

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

Я пытаюсь сделать это надежным/обобщаемым (пользовательские правила, вы можете использовать * вместо -, вы можете сделать так, чтобы вам нужно удвоить количество тире после q и т. Д.), Я был думая добавить некоторый специальный текст (например, -(%%n%%)p-q-(%%n%%), где все, что имеет (%%n%%) после того, как оно должно появиться точно «n»), но прежде чем я это сделаю, есть встроенные возможности регулярного выражения/достаточно простые исправления, или мне нужно будет начать с мой %%?

Заранее спасибо.


Редактировать: Глядя на мою проблему еще раз, лучший способ слова это то, что я по существу необходимо выяснить способ, чтобы отметить два (или, возможно, более) подстроки (в общем виде), чтобы убедиться, что они совпадение. У меня есть определенная степень гибкости в том, как я это делаю (не ограничиваясь только регулярным выражением), но в остальной части системы используется регулярное выражение, поэтому что-то, что не конфликтует/не может скомпрометировать то, что мне нужно сделать, чтобы заставить его работать, быть идеальным.

+0

Редактировано, чтобы лучше объяснить вопрос – Aturf

ответ

0

Если я правильно понял вашу проблему, регулярное выражение будет недостаточным, так как вы пытаетесь поймать строку, генерируемую нерегулярной грамматикой. Некоторые простые pushdown automaton должны здесь помочь.

+0

Я обновил вопрос, но я не уверен, что ответы будут обновлены с помощью изменений. Я не ограничиваюсь только регулярным выражением, чтобы определить, что такое «действительное выражение», у меня есть по существу все библиотеки java, которые помогают анализировать выражения (я могу сказать «о, замените любую строку« %% word %% »в выражении некоторая соответствующая предопределенная константа "). Я не уверен, что это поможет, но я обязательно посмотрю на ссылку, поэтому большое вам спасибо за это! – Aturf

0

Если вы позволили бы пользователю выбрать число до и после, то регулярное выражение было бы тривиальным.

В общем, это способ построения переменной regex для до и после.

(-{1,10}) # (1) 
p-q 
\1   # Backreference to capture group 1 

Если вы хотите, чтобы построить строку динамически, это будет что-то вроде этого
"(-{1," + vNum + "})p-q\\1"
Вы также можете добавить квантор на заднем конце, как этот
"(-{1," + vNum + "})p-q\\1{" + nFactor + }"

Вы можете изменить формы квантора, чтобы получить все необходимое {2} или диапазон {1,3} и т. д.

Помните, однако, что группа захвата содержит подмножество того, что вы ожидаете на заднем конце.