2016-03-05 3 views
3

У меня есть шаблон, который я назову как Z (фактический шаблон немного длинный и не имеет значения для вопроса). Проще говоря, я хочу иметь возможность сопоставлять либо \*\sZ, либо Z\:, но не оба, ни ни то, ни другое.Правильный сопоставление только префикса или только суффикс (XOR)

Я попытался использовать lookaheads (как показано ниже), однако из-за шаблона между префиксом и суффиксом они не будут работать.

(\*\s(?!\:))Z((?<!\*)\:) 

Есть ли способ достичь этого без необходимости дублировать шаблон (например, (\*\sZ|Z\:))?

Быстрое примечание о моем шаблоне нет \* в шаблоне Z, только в префиксе. С другой стороны, нет также в Z шаблон не \:, это только в суффиксе, если сразу идет Z, но не после каких-либо других персонажей (есть .* захват после суффикса)

+0

Какой язык вы используете? – ndn

+1

@ndn java, хотя я использовал онлайн-тестер 'pcre' для простоты. – Rogue

+1

Я не думаю, что есть способ сделать это в java только с регулярным выражением. Извлеките 'Z' в отдельной строке и используйте его для создания общего шаблона, чтобы вам не пришлось его дублировать. – ndn

ответ

3

Есть ли способ достичь этого без дублирования рисунка ?

Ответ «НЕТ». В отличие от and и or, которые являются фундаментальными свойствами регулярного выражения. В регулярном выражении вы можете легко построить выражение and с помощью concatenation и построить выражение or с помощью | соответственно.

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

Во-первых, у вас уже две модели здесь

\*\sZ 

и

Z\: 

Итак, как вы сказали, эти две модели не могли быть повреждены в то же время.

Так от свойств xor:

исключающее В = (А & ~ В) | (~ A & B).

Наконец, мы можем получить

\*\sZ(?!\:)|(?<!\*\s)Z\: 

См DEMO

+0

Несмотря на то, что ОП сказал то или другое, он просто означал просто '' '. Ему просто интересно, как не дублировать «Z». – ndn

+0

Он сказал: «Есть ли способ сделать это без дублирования рисунка?». Ответ «нет», потому что «XOR» не является фундаментальным строительным блоком регулярного выражения. – fronthem

+0

Я ответил «НЕТ» уже и предложил ему сделать то, что он сказал: «Я хочу иметь возможность сопоставлять либо' \ * \ sZ', либо 'Z \:', но не оба, ни ни то, ни другое ». который я дал ему по одному регулярному выражению по моему ответу. – fronthem

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