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


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,}$/

.*зазвичай жадібний, а це означає , що він дійде до кінця, що тестується рядки, і все , що слід, якщо є обов'язкові символи, не співпадатиме. Зазвичай у цьому випадку доцільно додати ?, як це .*?. Це трапилося зі мною за допомогою PCRE PHP
AlexanderMP

Це відповідає. "Жадібний" означає, що він відповідає максимальній сумі, в той час як все ще відповідає візерунку в цілому. /^.*b.*$/насправді відповідає "foobar", навіть якщо ви очікуєте, що перший жадібний вже .*відповідатиме всій рядку.
тдаммери

9

Цей регулярний вибір вибирає всі пробіли, ви можете використовувати його та замінити його єдиним пробілом

\s+

приклад в python

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.