2013-06-21 9 views
0

Я хочу знать, есть ли какой-либо способ, чтобы подтвердить, сгруппировала ли сопоставление. Например, давайте посмотрим, что я хочу, чтобы выполнить следующие 2 строки:Проверка правильности сопоставления регулярных выражений

string 1: "start magic someword anotherword test end" 

string 2: "start test x y z end" 

Я хочу, чтобы получить строку, которая имеет ключевые слова magic и test (оба из них). Но есть некоторые вопросы:

  • magic и test не может быть непрерывной один другой. Например, start magic word1 test word2 end
  • magic и test может быть не в том порядке, в строке, т.е. совпадение должно быть дано для start magic test end и start test magic end.

Чтобы справиться с этим, я принял следующее регулярное выражение:

start ((w1)*(w2)*\[^(end)])+end 

... что означает:

  • Строка должна начинаться со слова start и закончить end.
  • Матч w1 и w2 в любом порядке и другие слова, которые не являются end благодаря [^(end)].
  • Впоследствии конец матча.

Проблема с этим регулярным выражением является то, что все строки соответствуют его из-за [^(end)] и мою потребность отбросить слова между w1 и w2 в реальной строке.

Ввод регулярного выражения для строки 1, это будет:

start ((magic)*(test)*[^(end)])+end 

... который должен соответствовать только строке 1 (и это то, что я хочу). Но строка 2 также соответствует.

Есть ли какая-либо форма проверки, если группировка была согласована с двигателем регулярного выражения? Что-то вроде (if \1 != null), чтобы проверить, что magic и test ключевые слова были найдены? Я должен делать это с помощью регулярных выражений, потому что я не могу справиться с ним в исходном коде. Он предназначен для работы с инструментом, вызываемым командной строкой.

+0

Повторное выражение, которое вы написали, делает что-то совершенно отличное от того, что вы думаете, что оно делает, и будет соответствовать только строкам, которые выглядят как 'start magic * test() n (ddn)) (dend' – user1937198

ответ

0

Описание

Это выражение будет:

  • требует строки, чтобы начать с start с последующим пробелом
  • требует строки, чтобы закончить с пространством, с последующим end
  • должен содержать как magic и test в любом порядке
  • слова magic и test должны быть окружены по меньшей мере, одно пространство

^start(?=\s)(?=.*\smagic(?=\s))(?=.*\stest(?=\s)).*\send(\r|\n|\Z)

enter image description here

Ввод текста

start magic someword anotherword test end 
start test x y z end 
start the a magic show with Gob and Tony Wonder who will test till the end 

** Выход

[0] => start magic someword anotherword test end 
[1] => start the a magic show with Gob and Tony Wonder who will test till the end 
0

Наконец, я удалил начало и конец как маркеры и заменил их на **. Выражение теперь

"\*\* [^\*]*(w1|w2)[^\*]*(w1|w2)[^\*]* \*\*"

, чтобы соответствовать строке "** whatever w1|w2 whatever w1|w2 whatever **"

и не соответствовать строку, как "** whatever w1|w2 ** w1|w2 **"

@Denomales, вы можете сказать мне, где вы получили изображение с? thank you