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

109

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

1. this is a line containing  2 spaces
2. this is a line containing   3 spaces
3. this is a line containing multiple spaces first  second   three   four

Все вышеперечисленное - допустимые совпадения для этого регулярного выражения. Какое регулярное выражение мне следует использовать?

Сэм
источник
Вы пытаетесь проверить последовательные пробелы или все пробелы в этой строке?
Sachin Shanbhag
последовательные пробелы не все пробелы
Сэм
1
Что именно вы имеете в виду под словом «между словами»? В двух ваших примерах между словом и цифрой есть несколько пробелов. Как насчет пунктуации (например, вы хотите сопоставить несколько пробелов после точки и перед следующим словом)? А как насчет пробелов до / после последнего символа в строке? Вы тоже хотите сопоставить вкладки? А как насчет строк, состоящих только из пробелов?
Тим Пицкер,
пробелы между «содержащим и 2», «содержащим и 3», «первым и вторым», «вторым и третьим» ... Да, я хочу сопоставить пробелы после точки и перед следующим словом.
Сэм

Ответы:

180
[ ]{2,}

ПРОБЕЛ (2 и более)

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

\w[ ]{2,}\w

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

\w([ ]{2,})\w

или увидите, что до и после пробелов есть что-нибудь, а не только символы слова (кроме пробелов)

[^\s]([ ]{2,})[^\s]
АлександрМП
источник
1
\wозначает «символы слова», то есть буквенно-цифровые символы и подчеркивание, но не другие символы, не являющиеся пробелами. Чтобы проверить отсутствие пробелов, используйте \S(заглавную S). Кроме того, первый будет соответствовать только строкам, содержащим два или более пробелов и ничего больше.
tdammers
Я попытался развить вопрос. Я понял, что пропустил то, что вы сказали \S, просто предпочитаю не полагаться на регистр символов для такой функциональности, его легче читать.
AlexanderMP
1
Почему вы вообще используете якоря? Он ищет пробелы где-нибудь в линиях.
Тим Пицкер,
нет особой причины. Сначала я подумал, что они мне нужны, поэтому тянул их на протяжении всего процесса. На самом деле, вы правы, что я ошибаюсь в том, что использую их в данном случае. Я сразу отредактирую свой ответ.
AlexanderMP
1
\w[ ]{2,}\wне будет соответствовать word.<2 spaces>more wordsили строка, полностью состоящая из пробелов. [^\s]([ ]{2,})[^\s]\wбудет терпеть неудачу в строках, которые начинаются с пробелов или строк вроде bla<2 spaces>....
Тим Пицкер
12

Простое решение:

/\s{2,}/

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

/^.*\s{2,}.*$/

Если пробелы не обязательно должны быть последовательными:

/^(.*\s.*){2,}$/
тдаммеры
источник
.*обычно жадный, а это означает , что он дойдет до конца тестируемой строки, и все , что следует, если есть обязательные символы, не будет совпадать. Обычно в этом случае рекомендуется добавить ?вот так .*?. Это случилось со мной, используя PHP PCRE
AlexanderMP
Совпадает. «Жадный» означает, что он соответствует как можно большему количеству, но при этом соответствует шаблону в целом. /^.*b.*$/действительно совпадает "foobar", даже если вы ожидаете, что первый жадный уже .*будет соответствовать всей строке.
tdammers
9

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

\s+

пример на питоне

result = re.sub('\s+',' ', data))
Оуэн Ювоно
источник
4

Искать [ ]{2,}. Это найдет два или более соседних пробела в любом месте строки. Он также будет соответствовать начальным и конечным пробелам, а также строкам, полностью состоящим из пробелов. Если вы этого не хотите, посмотрите ответ Александра.

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

Проблема в \s{2,}том, что он также будет соответствовать символам новой строки в файлах Windows (где новые строки обозначаются CRLFили \r\nсовпадают с \s{2}.

Если вы также хотите найти несколько вкладок и пробелов, используйте [ \t]{2,}.

Тим Пицкер
источник
more than one space between words in a line. Как [ ]{2,}между словами? Вы хоть вопрос читали?
AlexanderMP
Вот почему я сослался на ваш ответ на случай, если ОП действительно хочет быть таким же строгим, как он пишет. Может нам стоит спросить его.
Тим Пицкер,
2

Вот мое решение

[^0-9A-Z,\n]

Это удалит все цифры, запятые и новые строки, но выберет среднее пространство, такое как набор данных

  • 20171106,16632 ESCG0000018SB
  • 20171107,280 ESCG0000018SB
  • 20171106,70476 ESCG0000018SB
Оджита
источник