#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
Комментарии:
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
, чтобы они соответствовали