Я хочу уменьшить количество шаблонов, которые мне нужно написать, используя регулярное выражение, которое подбирает любой или весь шаблон, когда он появляется в строке.
Возможно ли это с помощью 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"
Но он не должен совпадать с следующей строкой, потому что, хотя некоторые слова соответствуют друг другу, они разделяются несоответствующим словом: "собака сидела"
Это:
the( cat( sat( on( the( mat)?)?)?)?)?
ответит на ваш вопрос. Удалить "необязательные группы" parens "(...)?" для частей, которые не являются необязательными, добавьте дополнительные группы для вещей, которые должны совпадать.
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( cat( sat( on( the( mat)?)?)?)?)?
РЕДАКТИРОВАТЬ: Если вы добавите пост-условие, например привязку конца строки, совпадение будет полностью предотвращено в последнем примере, то есть последний пример не будет соответствовать в все:
the( cat( sat( on( the( mat)?)?)?)?)?$
Кредиты для подсказки перейдите на VonC. Спасибо!
Послесловие может, конечно, быть чем-то другим, что вы ожидаете после матча.
Кроме того, вы удаляете последний знак вопроса:
the( cat( sat( on( the( mat)?)?)?)?)
Будь в курсе: это приведет к единственному "не совпадению", поэтому первая строка также не будет соответствовать.
Это может быть довольно сложно:
(?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
" Он соответствует
кошка сидела на коврике
кошка
кот сидел
кошка сидела на коврике (ничто не соответствует)
собака сидела (там ничего не найдено)
С другой стороны, ответ Tomalak проще (если он исправлен, то есть заканчивается "$" ).
Я держу свой пост в вики.
Если вы знаете, что совпадение всегда начинается с первого символа, было бы намного быстрее совместить символы непосредственно в цикле. Я не думаю, что Regex все равно сделает это.
Возможно, было бы проще и логичнее подумать о проблеме немного по-другому..
Вместо того, чтобы сопоставлять шаблон с строкой... как насчет использования строки в качестве шаблона и поиска ее в шаблоне.
Например, если
string = "Кот сидел на" pattern = "кот сидел на коврике"
Строкавсегда является подмножеством шаблона и является просто случаем соответствия регулярному выражению.
Если это имеет смысл, -)