正则表达式,允许单词之间的空格

问题描述 投票:144回答:15

我想要一个正则表达式来阻止符号,只允许字母和数字。这个正则表达式工作得很好但它不允许单词之间的空格。

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

例如,使用此正则表达式时“HelloWorld”很好,但“Hello World”不匹配。

如何调整它以允许空格?

regex space alphanumeric
15个回答
284
投票

tl;dr

只需在character class中添加一个空格。

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


Now, if you want to be strict...

以上不完全正确。由于*意味着零或更多的事实,它将匹配以下通常不会匹配的所有情况:

  • 一个空字符串,“”。
  • 一个完全由空格组成的字符串,“”。
  • 用空格引导和/或跟踪的字符串,“Hello World”。
  • 一个字符串,在单词之间包含多个空格,“Hello World”。

最初我并不认为这些细节值得进入,因为OP提出这样一个基本问题,看起来严格并不是一个问题。既然问题已经获得了一些人气,我想说...

...使用@stema's answer

其中,在我的口味(不使用\w)转换为:

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

(无论如何,请upvote @stema。)

关于这个(和@ stema的)答案有些注意事项:

  • 如果要在单词之间允许多个空格(例如,如果您想允许意外的双重空格,或者如果您正在使用PDF中的复制粘贴文本),则在空格后添加+^\w+( +\w+)*$
  • 如果要允许制表符和换行符(空格字符),则用\s+替换空格: ^\w+(\s+\w+)*$ 在这里,我建议默认使用+,例如,Windows换行符按顺序包含两个空格字符\r\n,因此您需要使用+来捕获这两个字符。

Still not working?

检查你正在使用的正则表达式的方言。*在像Java这样的语言中,你必须逃避你的反斜杠,即\\w\\s。在旧的或更基本的语言和实用程序中,如sed\w\s都没有定义,所以用字符类写出来,例如[a-zA-Z0-9_][\f\n\p\r\t]分别。


*我知道这个问题被标记为,但基于25,000多个观点,我猜这不仅是那些遇到这个问题的人。目前它是谷歌搜索词组,正则表达空间词的第一个热门。


-1
投票

好好看看这些假设的答案......

...和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


-1
投票

我发现这个适用于“FullName”:

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

-1
投票

只需在正则表达式模式的末尾添加一个空格,如下所示:

[a-zA-Z0-9_ ]

-4
投票

试试。*?允许它为我工作的白色空间


100
投票

一种可能性就是将空间添加到您的字符类中,如acheong87建议,这取决于您对模式的严格程度,因为这也允许以5个空格开头的字符串或仅包含空格的字符串。

另一种可能性是定义一种模式:

我将使用\w这是在大多数正则表达式风格与[a-zA-Z0-9_]相同(在某些情况下它是基于Unicode的)

^\w+( \w+)*$

这将允许一系列至少一个单词,并且单词被空格分隔。

^匹配字符串的开头

\w+匹配一系列至少一个单词字符

( \w+)*是重复0次或更多次的组。在该组中,它期望一个空格,后跟一系列至少一个单词字符

$匹配字符串的结尾


21
投票

这个对我有用

([\w ]+)

10
投票

试试:

^(\w+ ?)*$

说明:

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

4
投票

我假设你不想要前导/尾随空格。这意味着你必须将正则表达式分为“第一个字符”,“中间的东西”和“最后一个字符”:

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

或者如果您使用类似perl的语法:

^\w[\w ]*\w$

另外:如果你故意在你的正则表达式中表示它也允许空字符串,你必须使整个事物可选:

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

如果你只想允许单个空格字符,它看起来有点不同:

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

这匹配0..n单词后跟一个空格,加上一个没有空格的单词。并使整个事物可选,以允许空字符串。


2
投票

这在开始时不允许空间。但允许在单词之间留出空格。还允许单词之间的特殊字符。 FirstName和LastName字段的正确的正则表达式。

\w+.*$

2
投票

这个正则表达式

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

将只允许单词之间的单个空格,没有前导或尾随空格。

以下是正则表达式的解释:

  1. ^在字符串开头处断言位置
  2. \w+匹配任何单词[a-zA-Z0-9_] 量词:+在一次和无限次之间,尽可能多次,根据需要回馈[贪心]
  3. 第一捕获组(\s\w+)* 量词:*在零和无限次之间,尽可能多次,根据需要回馈[贪心] \s匹配任何空白角色[\r\n\t\f ] \w+匹配任何单词[a-zA-Z0-9_] 量词:+在一次和无限次之间,尽可能多次,根据需要回馈[贪心]
  4. $断言字符串末尾的位置

2
投票

仅限字母:

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

对于字母数字值和_

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

0
投票

试试这个:( Python版)

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

根据您的数据集更改上限

© www.soinside.com 2019 - 2024. All rights reserved.