正则表达式在单词之间留有空格


188

我想要一个正则表达式,以防止符号,并且只允许字母和数字。下面的正则表达式效果很好,但不允许单词之间留空格。

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

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

如何调整它以留出空间?

Answers:


368

tl; dr

只需在角色类中添加一个空格即可。

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

 


现在,如果您想严格一点...

以上并不完全正确。由于这*意味着零或更多,因此它将匹配以下通常不希望匹配的所有以下情况:

  • 空字符串“”。
  • 完全由空格“”组成的字符串。
  • 一个以空格开头和/或结尾的字符串“ Hello World”。
  • 一个字符串,在单词“ Hello World”之间包含多个空格。

最初,我认为这样的细节不值得讨论,因为OP提出了一个基本问题,即严格性似乎不是问题。但是,既然这个问题越来越受欢迎,我想说...

...使用@stema的答案

以我的口味(不使用\w),它可以翻译为:

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

(无论如何,请投票@stema。)

关于此答案(和@stema)的一些注意事项:

  • 如果要在单词之间允许多个空格(例如,如果您希望允许意外的双倍空格,或者您正在使用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
它允许空字符串
Neha Choudhary13

1
哇,好简单!谢谢。没有网站或可以用来生成正则表达式的东西,对于我的初学者来说……
Pierre

1
@Pierre-接受人工指导并将其转换为明确的规则相当困难。(人类语言是不稳定的,充满歧义,我们的大脑完成解决事物和填补空白所需的大部分工作。计算机没有这样的大脑,并且模仿人的聪明尝试还不够强大。 )确实存在像debuggex.com这样的工具,这些工具可以直观地表示您的正则表达式,但尽管如此吸引人,但对于完整的初学者来说可能并不是很有帮助。但是,我建议您使用交互式教程来掌握基础知识。
Andrew Cheong 2014年

1
是的,如果只有空格,您的正则表达式也会匹配。我的答复是对Neha Choudary的评论。
Rajshekar Reddy

1
@Pierre三年后-今天我遇到了这个问题,看到了您的评论;我使用regex hero(regexhero.net)测试正则表达式。我认为在线版本只能在带有Silverlight的Internet Explorer中工作,但总比没有好。
Michael Armes

120

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

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

我将\w在大多数正则表达式中使用它,而不是[a-zA-Z0-9_](在某些情况下它是基于Unicode的)

^\w+( \w+)*$

这将允许一系列至少一个单词,并且单词之间用空格分开。

^ 匹配字符串的开头

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

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

$ 匹配字符串的结尾


这:regex101.com/#javascript还为您要分析的regex模式提供了很好的解释。
黑暗之星2014年

好的正则表达式,比许多[0-9a-z]都更简单,等等
乔治


11

尝试:

^(\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

@ssinfod:好收获。实际上,在该示例中,左括号是多余的。谢谢。
creinig

3

这个正则表达式

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

只会在字词之间留一个空格,而不会在开头或结尾加上空格。

以下是正则表达式的说明:

  1. ^ 在字符串开头声明位置
  2. \w+ 匹配任何单词字符 [a-zA-Z0-9_]
    1. 量词:+一次至无限次,尽可能多次,并根据需要返回[贪婪]
  3. 第一捕获小组 (\s\w+)*
    1. 量词:*在0到无限制的时间之间,尽可能多的次数,并根据需要返回[贪婪]
    2. \s 匹配任何空白字符 [\r\n\t\f ]
    3. \w+ 匹配任何单词字符 [a-zA-Z0-9_]
      1. 量词:+一次至无限次,尽可能多次,并根据需要返回[贪婪]
  4. $ 在字符串末尾声明位置

2

开头不允许有空间。但是在单词之间留有空格。还允许单词之间使用特殊字符。一个用于FirstName和LastName字段的正则表达式。

\w+.*$

该答案不正确/不正确。此模式匹配一​​个或多个字母数字,下划线,然后匹配零个或多个任何非换行符。对OP没有好处。
mickmackusa

2

仅对于字母:

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

对于字母数字值和_

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

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

0

试试这个:(Python版本)

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

根据您的数据集更改上限


0

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

[a-zA-Z0-9_ ]

-1

仔细查看了许多这些假定的答案...

...以及在检查Stack Overflow之后的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]+$

(这与单个单词不匹配,但是^[a-zA-Z0-9]+$如果您还需要捕获单个单词,则只需使用switch / if-else 即可。)

享受:D


3
[(?<=\d\s]匹配一个字符:(?<=,数字或一个空白字符,而不能是你的意思。如果应该在后面看,应该在(?<=\d\s),但是在那儿没有意义;正则表达式永远不会匹配。
艾伦·摩尔

给支持者:请不要支持错误的解决方案。他们使其他用户感到困惑,并使他们相信正则表达式可以做它不能做的事情。
WiktorStribiżew19年


-4

尝试。*?留出空格对我有用


那是因为.匹配所有东西。这很可能不是这里的解决方案。
rubik 2014年

它匹配零个或任何字符,具体取决于此序列之前和之后的内容。这将尽可能少地匹配。单点代表任何单个字符。
Znik
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.