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

277
我希望有一个正则表达式可以防止符号的输入,只允许字母和数字的组合。下面的正则表达式很好用,但不允许单词之间有空格。
^[a-zA-Z0-9_]*$

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

我该如何调整它以允许空格?

13个回答

550

简而言之

只需在您的字符类中添加一个空格即可。

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

 


现在,如果你想要严格一点...

上面的内容并不完全正确。由于*意味着零个或多个,它将匹配所有以下情况,这些情况通常不是我们想要匹配的:

  • 一个空字符串,""。
  • 一个完全由空格组成的字符串,"      "。
  • 一个前面和/或后面带有空格的字符串,"   Hello World  "。
  • 一个包含多个单词之间空格的字符串,"Hello   World"。

最初,我认为这样的细节并不值得深入探讨,因为OP问了一个如此基础的问题,以至于严格性似乎不是一个问题。然而,现在这个问题已经变得比较流行了,我想说...

...使用@stema的答案

在我的风格中(不使用\w),它的翻译是:

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

(Please upvote @stema regardless.) 请注意以下内容(以及@stema的回答):
  • If you want to allow multiple spaces between words (say, if you'd like to allow accidental double-spaces, or if you're working with copy-pasted text from a PDF), then add a + after the space:

    ^\w+( +\w+)*$
    
  • If you want to allow tabs and newlines (whitespace characters), then replace the space with a \s+:

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

    Here I suggest the + by default because, for example, Windows linebreaks consist of two whitespace characters in sequence, \r\n, so you'll need the + to catch both.

还是不起作用吗?

检查您正在使用哪种正则表达式方言。* 在像Java这样的语言中,您需要转义反斜杠, \\w\\s。 在旧版或更基本的语言和实用程序中,例如sed,未定义\w\s,因此请使用字符类编写它们,例如 [a-zA-Z0-9_][\f\n\p\r\t]

 


* 我知道这个问题被标记为,但根据25000多次浏览,我猜想不仅仅是那些人遇到了这个问题。目前它是谷歌搜索短语“正则表达式空格单词”的第一个结果。


3
它允许空字符串。 - Neha Choudhary
1
哇,好简单啊!谢谢。难道没有一个可以生成正则表达式的网站或工具么,我是指给新手用的那种... - Pierre
3
@Pierre - 将人类的指令转换为明确的规则相当困难。(人类语言是流动和充满歧义的,我们的大脑需要做大部分工作来解决问题并填补空白。计算机没有这样的大脑,而模仿它的聪明尝试还不够强大。)确实存在像https://www.debuggex.com/这样的工具,可以直观地表示您的正则表达式,但是对于完全初学者来说可能并不是非常有帮助。然而,我建议使用[交互式教程](http://regexone.com/)来掌握基础知识。 - Andrew Cheong
1
是的,如果只有空格,您的正则表达式也会匹配。我的回复是针对Neha Choudary的评论的。 - Rajshekar Reddy
1
@Pierre 三年后——我今天偶然看到了这个问题,看到了你的评论;我使用 Regex Hero(http://regexhero.net/)来测试正则表达式。我认为在线版本只能在带有 Silverlight 的 Internet Explorer 中使用,但总比没有好。 - Michael Armes
显示剩余4条评论

166

一种可能是简单地将空格添加到字符类中,如acheong87建议的那样。这取决于您对模式的严格程度,因为这也会允许以5个空格开头的字符串或仅由空格组成的字符串。

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

我将使用\w,在大多数正则表达式中它与[a-zA-Z0-9_]相同(在某些正则表达式中它基于Unicode)。

^\w+( \w+)*$

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

^匹配字符串的开头

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

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

$匹配字符串的结尾


这个网站:http://regex101.com/#javascript 也提供了一个很好的解释,用于分析你想要的正则表达式模式。 - Dark Star1
不错的正则表达式,比许多[0-9a-z]等要简单得多。 - George
我在我的正则表达式解释器中发现,我需要将整个字符串用括号括起来,以便第一个匹配是整个字符串,而不仅仅是第一个空格后面的单词。对我来说,^- (\w+( \w+)*)$ 这个表达式有效。 - NoseKnowsAll

41

这一个对我起了作用

([\w ]+)

11
这个回答缺乏解释。 - mickmackusa

15

尝试使用:

^(\w+ ?)*$

说明:

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

2
这绝对会导致回溯地狱。 - nhahtdh
2
例如,给定一个不匹配的字符串 ggggggggggggggggggggggggggggggggggggg;,由于过度回溯,您的正则表达式将需要很长时间才能达到结果。 - nhahtdh
1
好的,那你有什么建议? - hsz

13

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

^[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
1
请注意,此答案不适用于单个字符的字符串(它将匹配至少两个字符)。要解决这个问题,您可以添加一个测试来匹配单个字符:^\w$|^\w[\w ]*\w$ - Sly_cardinal

6
只需在正则表达式模式的末尾添加一个空格,如下所示:
[a-zA-Z0-9_ ]

这与被接受的答案有何不同? - Peter Mortensen

6
这个正则表达式
^\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. $ 断言字符串结束位置

3

这个正则表达式只允许字母和空格:

^[a-zA-Z ]*$

谢谢您提供的模式,我认为它只匹配单个空格,对吗? - Cuong Vo
不,它适用于多个空格。@CuongVo - Zahra Badri

3

该正则表达式不允许在开头使用空格,但可以在单词之间使用空格。此外,它还允许单词之间的特殊字符。这是用于名字和姓氏字段的良好正则表达式。

\w+.*$

这个答案是不正确/不准确的。这个模式匹配一个或多个字母数字字符、下划线,然后零个或多个非换行符字符。对于 OP 来说不好。 - mickmackusa

2

仅适用于字母:

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

对于字母数字值和_

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

2
这不是一个好的例子,因为(某事+)与(某事+)不同。在第一个例子中,只有单个字符将被捕获为$1。 - Znik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接