2015-03-16 6 views
0

Я ищу регулярное выражение, чтобы сделать DFA, который имеет все слова, кроме одного.RegEx: слова без подслов

Алфавит = {x, y, z} Words = все возможные слова, кроме слов, содержащих xyz. Пример:

Действительно: xyyzx yyxzyxz yyzzx

Недопустимые: х хуга г YXZ хугахуга YXZ

Благодаря.

ответ

1

Вы можете использовать метод сбрасывания с использованием регулярных выражений, как это:

[xyz]*xyz[xyz]*|([xyz]+) 

Working demo

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

enter image description here

Информация матча:

MATCH 1 
1. [7-12] `xyyzx` 
MATCH 2 
1. [13-20] `yyxzyxz` 
MATCH 3 
1. [21-26] `yyzzx` 

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

Метод отбрасывания состоит в отбрасывании всего шаблона с левой стороны регулярного выражения, разделенного трубами (регулярное выражение "или"), но с использованием группы захвата в самом правильном шаблоне. Таким образом, для этого регулярного выражения:

[xyz]*xyz[xyz]*|([xyz]+) 
discard patt--^ ^--- keep this pattern 
0

Fun!

\b(?:(?!xyz)[xyz])+\b 

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

(Испытано с perl -nE ' say for /(\b(?:(?!xyz)[xyz])+\b)/g '.)

+0

Привет, это работает, но можно преобразовать его в синтаксис JavaCC, как этот '(" b ")? ("B")? ("a" ("a")? "b" ("b")?) * ("a")? («а»)? Спасибо. – allnex

+0

@allnex Если вам нужно решение для JavaCC, вы можете пометить свой вопрос 'javacc', чтобы привлечь внимание экспертов. Я не знаком с синтаксисом JavaCC. –

0

Это не ясно из вашего вопроса, что должно произойти, если строка хуг присутствует. Должен ли быть вызван TokenManagerError или ParseException? Обычно в JavaCC рекомендуется принимать все входные данные на лексическом уровне --i.e. для написания диспетчера токенов, который не исключает никаких исключений. Так вот что я сделаю.

TOKEN: { 
    < BAD : (["x","y","z"])* "xyz" (["x","y","z"])* > 
    < GOOD: (["x","y","z"])+ > 
    < OTHER: ~[] > 
} 

void start() : {}{ [<GOOD>] <EOF> } 

Любой файл, содержащий строку «xyz», приведет к ошибке синтаксического анализа. Любой файл, содержащий символ, отличный от x, y или z, приведет к ошибке синтаксического анализа. Любой другой файл будет анализироваться без ошибок.

+0

Я думаю, что '+' мог бы быть «*». Тогда тело начала будет ''. –