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

Я хочу регулярное выражение, которое предотвращает символы и допускает только буквы и цифры. Это регулярное выражение отлично работает, но не допускает пробелов между словами.

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

Например, при использовании этого регулярного выражения "HelloWorld" отлично, но "Hello World" не соответствует.

Как я могу настроить его, чтобы разрешить пробелы?

Ответ 1

TL;DR

Просто добавьте пробел в класс символов.

^[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 для поисковой фразы, слово пространства регулярных выражений.

Ответ 2

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

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

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

^\w+( \w+)*$

Это позволит серию по крайней мере одного слова, а слова делятся на пробелы.

^ Соответствует началу строки

\w+ Сопоставьте серию по крайней мере одного символа слова

( \w+)* - это группа, которая повторяется 0 или более раз. В группе он ожидает пробел, за которым следует серия по меньшей мере одного символа слова

$ соответствует концу строки

Ответ 3

Это работало для меня

([\w ]+)

Ответ 4

Попробуйте:

^(\w+ ?)*$

Пояснение:

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

Ответ 5

Я предполагаю, что вам не нужно занимать ведущее/конечное пространство. Это означает, что вам нужно разделить регулярное выражение на "первый символ", "материал в середине" и "последний символ":

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

или если вы используете синтаксис типа perl:

^\w[\w ]*\w$

Кроме того: если вы намеренно сформулировали свое регулярное выражение, что оно также разрешает пустые строки, вы должны сделать все возможное:

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

Если вы хотите разрешать только одиночные пробелы, это выглядит несколько иначе:

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

Это соответствует 0..n словам, за которыми следует одно пробел, плюс одно слово без пробела. И делает все, что необязательно, для пустых строк.

Ответ 6

Это не позволяет использовать пробел в начале. Но допускает пробелы между словами. Также допускается использование специальных символов между словами. Хорошее регулярное выражение для полей FirstName и LastName.

\w+.*$

Ответ 7

Только для алфавитов:

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

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

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

Ответ 8

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

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

будет допускать только одно пробел между словами и без предшествующих или конечных пробелов.

Ниже приведено объяснение регулярного выражения:

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

Ответ 9

Хорошо посмотрел на многие из этих предполагаемых ответов...

... и bupkis после очистки Stack Overflow, а также других сайтов для регулярного выражения, которое соответствует любой строке без начального или конечного пробела и только одного пробела между строго буквенными символами.

^[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]+$

(Это не соответствует одиночным словам, но просто используйте switch/if-else с простым ^[a-zA-Z0-9]+$, если вам нужно поймать отдельные слова.)

наслаждайтесь: D

Ответ 10

Попробуйте следующее: (версия Python)

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

измените верхний предел на основе вашего набора данных

Ответ 11

Я нахожу, что это хорошо работает для "FullName":

([a-z',.-]+( [a-z',.-]+)*){1,70}/

Ответ 12

Все вышеперечисленные коды не работают, когда пользователь включает символ клавиатуры. Итак, вот regx, когда пользователю разрешено добавлять любой символ или слово, но они могут помещать пробелы между словами. Попробуйте это.

 ^[^ ]+( [^ ]+)*$

Ответ 13

попробуйте. *? чтобы позволить белым пространствам работать для меня