Сопоставьте группы слов с любыми другими словами между использованием регулярного выражения

#regex

Вопрос:

У меня есть несколько групп слов. Например.:

 ["foo", "bar", "baz"]
["hello", "world"]
 

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

 "foo bar baz hey how do you do hello world"
"foo bar baz hello world"
"something cool foo bar baz maybe hello world"
"something cool foo bar baz maybe hello world amazing"
 

Я строю строку регулярного выражения динамически. В моем случае вот что я строю:

 "( S  )*foo bar baz( S  )*hello world( S  )*"
 

Я ожидаю S , что они будут соответствовать чему угодно, кроме пробела.

Я ожидаю ( S ) , что он будет соответствовать чему угодно, кроме пространства, окруженного пространством с обеих сторон.

И я ожидаю ( S )* , что они будут соответствовать любому количеству слов, окруженных пробелами.

Но это работает не так, как я ожидаю. Например, в строке

 "something cool foo bar baz maybe hello world amazing"
 

Только эта часть сопоставляется регулярным выражением, но не целой строкой

 " cool foo bar baz maybe hello world "
 

Чего мне не хватает в моем регулярном выражении?

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

Комментарии:

1. Воспользуйся: .*?bfoo bar bazb.*?bhello worldb.*

Ответ №1:

Использование ( S )* совпадает с пробелом до и после, поэтому повторение будет соответствовать, например, 2 последовательным пробелам.

Что вы могли бы сделать, так это опустить пробел в начале перед первым списком слов, а между списками слов и после них опустить пробел в конце и добавить пробел между первым и вторым списком.

 (S  )*foo bar baz( S )* hello world( S )*
 
  • (S )* При необходимости повторите 1 символов без пробелов, за которыми следует пробел
  • foo bar baz Сопоставьте первый список слов
  • ( S )* В промежутках между списками при необходимости повторяйте символы пробела и 1 без пробелов и добавляйте пробел в конце
  • hello world Сопоставьте второй список слов
  • ( S )* Необязательно сопоставлять завершающие слова

Демонстрация регулярных выражений