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

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

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

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

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

19 ответов

Решение

ТЛ; др

Просто добавьте пробел в свой класс персонажа.

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


Теперь, если вы хотите быть строгим...

Выше не совсем правильно. Благодаря тому факту, что * означает ноль или более, это будет соответствовать всем следующим случаям, которые обычно не будут соответствовать:

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

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

... используйте ответ @stema.

Который, в моем вкусе (без использования \w) переводится как:

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

(Пожалуйста, upvote @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] соответственно.


* Я знаю, что этот вопрос помечен vb.net, но, исходя из 25 000 просмотров, я предполагаю, что не только те люди, которые сталкиваются с этим вопросом. В настоящее время это первое попадание в Google по поисковой фразе, слову регулярного выражения.

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

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

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

^\w+( \w+)*$

Это позволит серии не менее одного слова и слова разделены пробелами.

^ Сопоставить начало строки

\w+ Совпадение серии, состоящей как минимум из одного слова

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

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

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

([\w ]+)

Попробуйте с:

^(\w+ ?)*$

Объяснение:

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

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

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

или если вы используете Perl-подобный синтаксис:

^\w[\w ]*\w$

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

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

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

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

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

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

^\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. $ Утвердить позицию в конце строки

Просто добавьте пробел в конец шаблона регулярного выражения следующим образом:

[a-zA-Z0-9_ ]

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

\w+.*$

Это регулярное выражение допускает только алфавит и пробелы:

      ^[a-zA-Z ]*$

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

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

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

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

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

      /^[a-z0-9_.-\s]+$/i

Например:

      /^[a-z0-9_.-\s]+$/i.test("") //false
/^[a-z0-9_.-\s]+$/i.test("helloworld") //true
/^[a-z0-9_.-\s]+$/i.test("hello world") //true
/^[a-z0-9_.-\s]+$/i.test("none alpha: ɹqɯ") //false

Единственным недостатком этого регулярного выражения является строка, полностью состоящая из пробелов, "" также будет отображаться как истина.

Это было мое регулярное выражение: @"^(?=.{3,15}$)(?:(?:\p{L}|\p{N})[._()\[\]-]?)*$"

Я только что добавил ([\w ]+) в конце моего регулярного выражения до *

@"^(?=.{3,15}$)(?:(?:\p{L}|\p{N})[._()\[\]-]?)([\w ]+)*$"

Теперь в строке разрешено иметь пробелы.

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

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

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

... и 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]+$

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

наслаждайся:D

Попробуйте с этим:

result = re.search(r"\w+( )\w+", text)

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

string1 = 'hello_World'

или же

string2 = 'hello world'

от

pattern = '[\w\s]+'

Я считаю, что это хорошо работает для "FullName":

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

Попробуйте это: (версия Python)

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

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

Пытаться.*? чтобы пустые места это работало на меня

Другие вопросы по тегам