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

1

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

Возможно ли это с помощью 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"

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

  • 0
    Вам не ясно, хотите ли вы, чтобы "" соответствовал, если за ним следует "собака", или нет.
Теги:

4 ответа

7

Это:

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)?)?)?)?)

Будь в курсе: это приведет к единственному "не совпадению", поэтому первая строка также не будет соответствовать.

  • 1
    -1: в «собаке сидели на коврике» частично совпадения, в то время как пользователю явно не требуется совпадения ...
  • 0
    Хорошо ... я отменяю -1;) Если вы добавите '$' в конце вашего регулярного выражения, это работает :)
Показать ещё 1 комментарий
2

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

(?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 проще (если он исправлен, то есть заканчивается "$" ).
Я держу свой пост в вики.

  • 0
    Спасибо за совет, учтенный в! :-) Если никакое постусловие не может быть определено, ваше регулярное выражение все еще является единственным способом сделать это. Переключение в вики-режим может быть немного преждевременным. ;-)
1

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

0

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

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

Например, если

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

Строка

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

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

  • 0
    А что, если шаблон «(кот | собака | птица | летать) (сел | стоял) на коврике»?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню