2015-06-25 15 views
0

Как мы узнали, учитывая шаблон регулярного выражения (например, A B A B A C), мы можем преобразовать его в DFA. В этом примере это будет похоже на цепочку (вы можете проверить ее here).Как создать регулярное выражение, используемое для поиска шаблона, вместо проверки шаблона?

Этот «цепной» DFA может определить, соответствует ли данная строка шаблону или нет (т. Е. Принять/отклонить); Но он не может определить, есть ли какое-либо событие в строке и идентифицировать все из них.

Пример: Пусть это к Строка поиска: A B C A B A B A B A C A B C

Хотя есть явление, начиная с 6-го символа, то «цепеобразная» DFA не может сказать это. Все, что он может сделать, это отклонить эту строку.

Вопрос: Возможно ли создать регулярное выражение, поддерживающее такую ​​функциональность?

(Примечание. Я понимаю, этот вопрос отчасти сбивает с толку, я хотел бы уточнить, что вас смущает)

+0

Я предполагаю, что вы говорите о [«классических» регулярных выражениях] (https://en.wikipedia.org/?title=Regular_expression#Formal_definition), как изучали в теории формального языка, а не в синтаксисе соответствия регулярному выражению найденный во многих языках программирования (который является довольно далеким потомком классической нотации). –

+0

Очевидно, что вы можете делать то, что вы просите, поскольку большинство языков программирования имеют функцию «заменить регулярное выражение», которая требует, чтобы она определяла, где произошло совпадение. Кроме того, операции «match regexp» часто возвращают результат, содержащий подстроку, которая соответствует. – Barmar

+0

Для очень простого примера, поэтому опция '-o' для' grep' в Linux; вместо того, чтобы показывать всю строку, которая соответствует, она просто показывает часть строки, которая соответствует регулярному выражению. – Barmar

ответ

0

Язык строк, содержащих подстроку ABABAC сопоставляется регулярным выражением:

.*ABABAC.* 

Где символ . обозначает подвыражение, которое соответствует любому одному входному символу (например, (A|B|C), если только на языке ввода есть символы A, B и C). Чтобы указать, имеет ли строка подстроку ABABAC, вы можете создать NFA или DFA из этого регулярного выражения и проверить, принимает ли она вашу строку.

Определение расположение подстроки во входной строке не представляется возможным с (один) стандартный N/DFA, просто потому, что Н/DFA определяется возвращать только один бит информации (принять/отклонить). Тем не менее, возможно реализовать «расширенный N/DFA», который, помимо соответствия входному сигналу, также отслеживает, где в строке произошел последний переход состояния; этой информации достаточно, чтобы эффективно восстановить местоположение подстроки.

+0

Рад видеть, как вы это понимаете. Может быть, '. * (ABABAC) *. *' Может найти несколько совпадений, правильно? – JackWM

+0

Не совсем, нет; он находит соседние повторы 'ABABAC', ноль или более. Но это не очень хорошо продуманное регулярное выражение. Конечный '. *' Излишний как в теории, так и на практике. Выражение '(. * ABABAC) * будет находить ноль или более повторений в любой строке. – tripleee

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

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