Поиск регулярных выражений для строк с дополнительными пробелами для данного слова

#regex

#регулярное выражение

Вопрос:

Вот строка:

 foo
  

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

 (f oo|fo o|f o o)
  

Однако, если длина больше, я не могу просто сделать, как указано выше.

Я пытался

 fs?os?o
  

Но в этом случае «foo» тоже будет совпадать.

Обновить

Как пояснил @CertainPerformace:

Вся строка должна содержать хотя бы один пробел, но не имеет значения, где и сколько, главное, чтобы где-то был хотя бы один

Однако я не хочу, чтобы такие слова, как b ar , совпадали. Я хочу, чтобы строки foo-but-with-extra-spaces были сопоставлены.

Например, учитывая строку

 foo f oo f o o b ar
  

Я хочу, чтобы совпадали только f oo и f o o .

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

1. Вы имеете в виду, что вся строка должна содержать хотя бы один пробел, но не имеет значения, где и сколько, главное, чтобы где-то был хотя бы один?

2. @CertainPerformance Да, смотрите первый пример. Мне нужен его эквивалент

3. Есть вещи, которые лучше всего выполнять без регулярных выражений.

4. @Blackhole, ты попал в точку. Есть решение на javascript?

5. @bravemaster Найдите f ?o ?o (то есть 'foo'.split().join(' ?') ) и подсчитайте количество пробелов после этого.

Ответ №1:

После сопоставления первого символа найдите символы от нуля до n - 2 пробела, за которыми следует пробел, где n — длина строки. Например, с foo вы бы повторили без пробелов до 1 раза. Это гарантирует, что пробел появится перед тем, как закончатся символы в нужном вам слове.

Затем завершите поиск и сопоставьте буквы обычным образом, возможно, с пробелами между ними:

 f(?=S{0,1} ) *o *o
  

https://regex101.com/r/nzejCS/3

Для более длинного слова, например foobar , вы бы сделали:

 f(?=S{0,4} ) *o *o *b *a *r
  

Вы также можете просмотреть отрицательный результат в начале:

 (?!foo)f *o *o
  

https://regex101.com/r/nzejCS/4

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

1. Что, если слова находятся в одной строке? Например foo f oo f o o . Я удалил курсор и знак доллара из вашего решения, но затем foo также соответствует.

2. Используя тот же шаблон в ответе, эта строка также совпадает: regex101.com/r/nzejCS/2 Шаблон гарантирует, что он содержит хотя бы один пробел, затем он соответствует всему остальному тексту.

3. Дело в том, что регулярное выражение не должно находить такие слова, как b ar . Он должен найти слова с лишним пробелом foo-but.

4. Должно ли совпадать несколько вхождений исходного слова, как у вас foo f oo f o o , или это должно быть только 1 полное слово?

5. В foo f oo f o o b ar , я хочу только f oo , f o o , чтобы они соответствовали