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


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_]+)*$

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

 


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


3
это позволяет пустую строку
Неха Чоудхари

1
Вау, так просто! Спасибо. Нет ли там сайта или чего-то, что можно использовать для создания выражений регулярных выражений, для noobs я имею в виду ...
Pierre

1
@Pierre - довольно сложно взять человеческие инструкции и преобразовать их в явные правила. (Человеческий язык подвижен и полон двусмысленностей, и наш мозг выполняет большую часть работы, необходимой для решения проблем и заполнения пробелов. У компьютеров нет такого мозга, а умные попытки имитировать его еще недостаточно сильны. Существуют такие инструменты, как debuggex.com, которые визуально представляют ваше регулярное выражение, но, как бы оно ни было привлекательным, оно может оказаться не очень полезным для начинающих. Тем не менее, я рекомендую интерактивный учебник, чтобы разобраться с основами.
Эндрю Чонг

1
Да, и ваше регулярное выражение будет соответствовать, если есть только пробелы. Мой ответ был на комментарий Нехи Чудари.
Раджшекар Редди

1
@Pierre Три года спустя - я столкнулся с этим вопросом сегодня, видел твой комментарий; Я использую regex hero ( regexhero.net ) для тестирования регулярных выражений. Я думаю, что онлайн-версия работает только в Internet Explorer с Silverlight, но это лучше, чем ничего.
Майкл

122

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

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

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

^\w+( \w+)*$

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

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

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

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

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


Это: regex101.com/#javascript также предоставляет хорошее объяснение паттерна регулярных выражений, который вы хотите проанализировать.
Dark Star1

Хорошее регулярное выражение, намного проще, чем много [0-9a-z] и т. Д.
Джордж

Я обнаружил в своем интерпретаторе регулярных выражений, что мне нужно заключить всю строку в скобки, чтобы первое совпадение было всей строкой, а не только словами, идущими после первого пробела. Это ^- (\w+( \w+)*)$работает для меня.
NoseKnowsAll


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

1
@ssinfod: Хороший улов. На самом деле открывающая скобка в этом примере является излишней. Спасибо.
Creinig

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

1

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

[a-zA-Z0-9_ ]

0

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

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

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


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

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

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


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

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


-4

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


Это потому, что .соответствует всему. Это, скорее всего, не будет решением здесь.
Рубик

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