регулярное выражение: сопоставление частей строки, когда строка содержит часть шаблона регулярного выражения - PullRequest
1 голос
/ 29 января 2009

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

Возможно ли это с Regex?

E.g. Pattern is: "the cat sat on the mat"

I would like pattern to match on following strings:
"the"
"the cat"
"the cat sat"
...
"the cat sat on the mat"

Но это не должно совпадать в следующей строке, потому что, хотя некоторые слова совпадают, они разделяются несоответствующим словом: "собака сидела"

Ответы [ 4 ]

7 голосов
/ 29 января 2009

Это:

the( cat( sat( on( the( mat)?)?)?)?)?

ответит на ваш вопрос. Удалить "необязательную группу" паренов "(...)?" для частей, которые не являются необязательными, добавьте дополнительные группы для элементов, которые должны совпадать.

the                       // complete match
the cat                   // complete match
the cat sat               // complete match
the cat sat on            // complete match
the cat sat on the        // complete match
the cat sat on the mat    // complete match
the dog sat on the mat    // two partial matches ("the")

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

^the( cat( sat( on( the( mat)?)?)?)?)?

РЕДАКТИРОВАТЬ: Если вы добавите постусловие, такое как привязка конца строки, сопоставление будет полностью предотвращено в последнем примере, то есть последний пример не будет соответствовать вообще :

the( cat( sat( on( the( mat)?)?)?)?)?$

Кредиты за чаевые идут на VonC . Спасибо!

Пост-условие может, конечно, быть чем-то еще, что вы ожидаете после матча.

Кроме того, вы можете удалить последний знак вопроса:

the( cat( sat( on( the( mat)?)?)?)?)

Имейте в виду, что: из-за этого одно "the" не будет совпадать, поэтому первая строка также не будет совпадать.

2 голосов
/ 29 января 2009

Это может быть довольно сложно:

(?ms)the(?=(\s+cat)|[\r\n]+)(:?\s+cat(?=(\s+sat)|[\r\n]+))?(:?\s+sat(?=(\s+on)|[\r\n]+))?(:?\s+on(?=(\s+the)|[\r\n]+))?(:?\s+the(?=(\s+mat)|[\r\n]+))?(:?\s+mat)?[\r\n]+

Значение:

  • Я хочу "the", только если за ним следует "cat" или конец строки
  • тогда я хочу "cat" (необязательно), только если за ним следует "sat"
  • и так один
  • с последующим и концом строки (которые гарантируют, что они не будут совпадать с частичной "прогулкой кота ...")

Это соответствует

кот сидел на коврике
кот
кот сидел
кот сидел на коврике (ничего не совпадает)
собака сидела (там ничего не совпало)


Если подумать, Ответ Томалака проще (если он исправлен, то заканчивается на $).
Я оставляю свой пост в вики.

1 голос
/ 29 января 2009

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

0 голосов
/ 29 января 2009

Возможно, было бы проще и логичнее думать о проблеме немного по-другому ..

Вместо сопоставления шаблона со строкой .... как насчет использования строки в качестве шаблона и его поиска в шаблоне.

Например, где

string = "кот сидел на" pattern = "кот сидел на коврике"

строка всегда является подмножеством шаблона и является просто случаем сопоставления с регулярным выражением.

Если это имеет смысл; -)

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