2014-04-05 2 views
0

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

Текущая картина:

/(address|alias|parents|members|notes|host|name)(?!(\t{5}|\S+))/ 

Я пытаюсь соответствовать, когда строка не разнесены правильно, но не тогда, когда она является частью большего слова.

Например, я хочу это, чтобы соответствовать,

host \t{4} something 

но,

hostgroup \t{5} something 

В приведенном выше примере это будет соответствовать hostgroup и в конечном итоге, разделив его на 2 отдельные слова «хозяин» и "группа"

Match:

notes \t{4} something 

но,

notes_url \t{5} something 

Используя мой рисунок он заканчивает поворот в:

notes \t{5} _url 

Хотелось бы надеяться, что делает немного больше смысла.

+0

Когда вы говорите *, «за которым не следуют оба следующих шаблона» *, вы имеете в виду «не сопровождаемый * ни одним из двух шаблонов»? Требуется ли, чтобы за словом следовало меньше пяти вкладок? – Borodin

+0

Ваша цель не совсем понятна. Если вы не можете четко сформулировать то, что хотите, в словах, по крайней мере, вы можете отредактировать вопрос, чтобы предоставить множество примеров того, что вы хотите сопоставить, и строк, которые у вас нет, и почему. Часто этот шаг будет иметь дополнительное преимущество, помогая вам реализовать решение самостоятельно, но, как минимум, это поможет нам советовать вам намного лучше. – Miller

+0

Чтобы ответить на первый вопрос, я хочу, чтобы он соответствовал, когда первая группа не подчиняется ни второй группе. Я пытаюсь выровнять его со стандартом из 5 вкладок в любой из строк в первой группе, поэтому я хочу, чтобы он соответствовал и исправлял его, например, есть только 4 вкладки, следующие или более 5, однако я также не хочу чтобы попытаться сделать это, если первое совпадение является частью большего слова. Означает ли это немного больше смысла? Прошу прощения, если оригинальное объяснение было немного более неясным, чем то, что я намеревался. – user3486833

ответ

0

Я не совсем понимаю, что вы хотите, но границы слов, вероятно, будут делать то, что вы просите.

Это работает для вас?

/\b(address|alias|parents|members|notes|host|name)\b(?!\t{5})/ 

Update

Поняв вашу проблему лучше, делает это делать то, что вы хотите?

+0

Практически, но я также стараюсь избегать совпадения, если первая группа является частью большего слова. – user3486833

+0

@ user3486833: Попробуйте. Он делает это. – Borodin

+0

Это похоже на трюк, благодаря кучу! – user3486833

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