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


191

Я хочу регулярний вираз, який забороняє символи та дозволяє лише літери та цифри. Регекс нижче працює чудово, але він не допускає пробілів між словами.

^[a-zA-Z0-9_]*$

Наприклад, при використанні цього регулярного виразу "HelloWorld" це добре, але "Hello World" не відповідає.

Як я можу налаштувати його, щоб дозволити пробіли?

Відповіді:


372

тл; д-р

Просто додайте пробіл у своєму класі персонажів .

^[a-zA-Z0-9_ ]*$

 


Тепер, якщо ви хочете бути суворими ...

Сказане не зовсім коректно. Через те, що *означає нуль або більше , воно збігалося б із усіма наведеними нижче випадками, які зазвичай не означають відповідати:

  • Порожній рядок, "".
  • Рядок, що складається повністю з пробілів, "".
  • Рядок, який веде та / або стежить з пробілами, "Hello World".
  • Рядок, що містить кілька пробілів між словами "Hello World".

Спочатку я не вважав, що в такі деталі варто заглиблюватися, оскільки ОП задавали таке основне питання, що, здається, суворість не викликала особливих проблем. Тепер, коли питання набуло певної популярності, я хочу сказати ...

... використовуйте відповідь @ stema .

Що, на мій смак (без використання \w), означає:

^[a-zA-Z0-9_]+( [a-zA-Z0-9_]+)*$

(Будь ласка, підкажіть @stema незалежно.)

Деякі речі, які слід зазначити щодо цієї відповіді (та @ stema's):

  • Якщо ви хочете дозволити декілька пробілів між словами (скажімо, якщо ви хочете дозволити випадкові подвійні пробіли або працюєте з текстом, вставленим з PDF, копіюючи текст), додайте +пробіл після:

    ^\w+( +\w+)*$
  • Якщо ви хочете дозволити вкладки та нові рядки (пробіли), замініть пробіл на \s+:

    ^\w+(\s+\w+)*$

    Тут я пропоную +за замовчуванням, тому що, наприклад, розриви рядків Windows складаються з двох символів пробілів послідовно \r\n, тож вам потрібно +буде ловити обох.

Все ще не працює?

Перевірте, який діалект регулярних виразів ви використовуєте. * У таких мовах, як Java, вам доведеться уникати зворотних нахилів, тобто \\w і \\s. У старіших або більше основних мовах і комунальні послуги, як sed, \wі \sне визначені, тому їх виписувати з класами символів, наприклад [a-zA-Z0-9_] , і [\f\n\p\r\t], відповідно.

 


* Я знаю, що це питання позначено тегами, але, виходячи з 25 000+ переглядів, я здогадуюсь, що це питання не лише ті, хто стикається. В даний час це перший хіт в Google за пошуковою фразою, регулярним словом пробілу виразів .


3
це дозволяє порожній рядок
Neha Choudhary

1
Вау, так просто! Дякую. Чи є сайт чи щось, що можна використати для генерування виразів виразів, для нообів, я маю на увазі ...
П'єр,

1
@Pierre - досить важко приймати людські вказівки та перетворювати їх на явні правила. (Людська мова є рідкою та багатозначною, і наші мізки виконують більшу частину роботи, необхідної для вирішення речей та заповнення прогалин. У комп’ютерів немає такого мозку, а розумні спроби імітувати їх ще не є достатньо потужними. ) Існують такі інструменти, як debuggex.com, які візуально представляють ваш регулярний вираз, але настільки привабливі, як це, можливо, не будуть дуже корисними для початківців початківців. Однак я рекомендую інтерактивний підручник, щоб звести основи.
Ендрю Чонг

1
Так, і ваш регулярний вираз буде відповідати, якщо є просто пробіли. Моя відповідь була на коментар Neha choudary.
Райджекар Редді

1
@Pierre Через три роки - я сьогодні натрапив на це питання, побачив ваш коментар; Я використовую герой-герой ( regexhero.net ) для тестування регулярних виразів. Я думаю, що онлайн-версія працює лише в Internet Explorer із Silverlight, але це краще, ніж нічого.
Майкл Армес

121

Однією з можливостей було б просто додати простір до вашого класу символів, як, наприклад, запропонував acheong87, це залежить від того, наскільки ви суворо ставитесь до свого шаблону, оскільки це також дозволить створити рядок, починаючи з 5 пробілів, або рядки, що складаються лише з пробілів.

Інша можливість - визначити шаблон:

Я буду використовувати \wце в більшості ароматів регулярного гекса таку, ніж [a-zA-Z0-9_](у деяких це Unicode)

^\w+( \w+)*$

Це дозволить створити ряд принаймні одного слова, а слова розділені пробілами.

^ Зрівняйте початок рядка

\w+ Зіставте ряд принаймні одного символьного слова

( \w+)*це група, яка повторюється 0 і більше разів. У групі він очікує пробілу, за яким слід ряд принаймні одного символьного слова

$ відповідає кінці рядка


Це: regex101.com/#javascript також дає хороше пояснення для шаблону регулярних виразів, який ви хочете проаналізувати.
Темна зірка1

Хороший Реджекс, набагато простіше, ніж багато [0-9a-z] тощо.
Джордж


12

Спробуйте:

^(\w+ ?)*$

Пояснення:

\w             - alias for [a-zA-Z_0-9]
"whitespace"?  - allow whitespace after word, set is as optional

2
Це так призведе до зворотного відтворення пекла.
nhahtdh

1
Наприклад, з огляду на невідповідну рядок ggggggggggggggggggggggggggggggggggggg;, ваш регекс займе дуже багато часу, щоб досягти результату через надмірне зворотне відстеження.
nhahtdh

Гаразд, так що ви пропонуєте?
hsz

7

Я припускаю, що ви не хочете провідної / заднім простором. Це означає, що ви повинні розділити регулярний вираз на "перший символ", "матеріал посередині" та "останній символ":

^[a-zA-Z0-9_][a-zA-Z0-9_ ]*[a-zA-Z0-9_]$

або якщо ви використовуєте синтаксис, схожий на perl:

^\w[\w ]*\w$

Також: Якщо ви навмисно сформулювали свій регулярний вираз, що він також дозволяє порожні рядки, вам потрібно зробити всю річ необов’язковою:

^(\w[\w ]*\w)?$

Якщо ви хочете дозволити лише один пробіл, це виглядає трохи інакше:

^((\w+ )*\w+)?$

Це відповідає 0..n слів, за якими слідує один пробіл, плюс одне слово без пробілу. І робить всю річ необов’язковою, щоб дозволити порожні рядки.


Простір і \sне рівноцінні. \sвідповідає більше, ніж просто місце.
nhahtdh

@nhahtdh: Дякую за коментар. Я занадто звик відповідати пробілам взагалі, мабуть. Відповідь фіксовано.
creinig

Чи можливо, у першому виразі вам не вистачає дужок, що закриваються? Я не впевнений, що не пробував.
ssinfod

@ssinfod: Хороший улов. Насправді дужки, що відкриваються, є зайвим у цьому прикладі. Дякую.
Крейніг

4

Це регулярний вираз

^\w+(\s\w+)*$

дозволить отримати єдиний пробіл між словами, а не провідні чи зворотні пробіли.

Нижче пояснення регулярного виразу:

  1. ^ Позиція затвердження на початку рядка
  2. \w+ Відповідайте будь-якому символу слова [a-zA-Z0-9_]
    1. Кількісний показник: +між одним і необмеженим часом, якомога більше разів, віддаючи по мірі необхідності [жадібно]
  3. 1-я група захоплення (\s\w+)*
    1. Кількісний показник: *між нулем і необмеженим часом, якомога більше разів, віддаючи по мірі необхідності [жадібно]
    2. \s Відповідайте будь-якому символу пробілу [\r\n\t\f ]
    3. \w+ Відповідайте будь-якому символу слова [a-zA-Z0-9_]
      1. Кількісний показник: +між одним і необмеженим часом, якомога більше разів, віддаючи по мірі необхідності [жадібно]
  4. $ Позиція затвердження в кінці рядка

2

Це не дає місця на початку. Але допускає пробіли між словами. Також допускаються спеціальні символи між словами. Хороший регулярний вираз для полів FirstName та LastName.

\w+.*$

Ця відповідь невірна / неточна. Цей візерунок відповідає одному або більше буквено-цифрових, підкреслюваних, а потім нульових або більше будь-яких символів, що не є новим рядком. Немає користі для ОП.
mickmackusa

2

Лише для алфавітів:

^([a-zA-Z])+(\s)+[a-zA-Z]+$

Для буквено-цифрового значення та _:

^(\w)+(\s)+\w+$

1
це не гарний приклад, тому що (щось) + не те саме, що (щось +). У першому прикладі буде зафіксовано лише один символ як $ 1.
Znik

0

Спробуйте: (версія Python)

"(A-Za-z0-9 ){2, 25}"

змінити верхню межу залежно від набору даних


0

Просто додайте пробіл до кінця шаблону регулярного вираження таким чином:

[a-zA-Z0-9_ ]

-1

Я добре роздивився багато цих передбачуваних відповідей ...

... і bupkis після очищення переповнення стека, а також інших сайтів для регулярного вираження, що відповідає будь-якій рядку без початкового чи зворотнього пробілу та лише одному проміжку між строго слів з символами альфа.

^[a-zA-Z]+[(?<=\d\s]([a-zA-Z]+\s)*[a-zA-Z]+$

Таким чином легко модифікується на буквено-цифрові:

^[a-zA-Z0-9]+[(?<=\d\s]([a-zA-Z0-9]+\s)*[a-zA-Z0-9]+$

(Це не відповідає окремим словам, але просто використовуйте перемикач / інше з простим, ^[a-zA-Z0-9]+$якщо вам потрібно ловити окремі слова додатково.)

насолоджуватися: D


3
[(?<=\d\s]відповідає один символ: (, ?, <, =, цифра або символ пробілу, і це не може бути те , що ви мали в виду. Якщо це повинно було виглядати позаду, воно повинно бути (?<=\d\s), але це не має сенсу; регекс ніколи не збігався б.
Алан Мур

Для відповідальних користувачів: Будь ласка, не підтримуйте неправильні рішення. Вони збивають з пантелику інших користувачів і змушують їх повірити, що регекс може робити те, що не робить.
Wiktor Stribiżew


-4

спробувати. *? щоб дозволити білі простори, це працювало для мене


Це тому, що .відповідає всім. Тут, швидше за все, це не буде рішенням.
rubik

вона відповідає нулю або будь-яким символам, залежно від того, що є до і після цієї послідовності. це буде відповідати якомога менше. одинарна точка являє собою будь-який окремий символ.
Znik
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.