245

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

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

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

如何调整它以允许空间?

4

12 回答 12

481

tl;博士

只需在您的角色类中添加一个空格。

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

 


现在,如果你想严格...

以上并不完全正确。由于这*意味着zero 或 more,它将匹配以下所有通常不会匹配的情况:

  • 一个空字符串,“”。
  • 完全由空格“”组成的字符串。
  • 一个以空格开头和/或结尾的字符串,“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 多个视图,我猜不仅仅是那些遇到这个问题的人。目前它是谷歌搜索词组的第一个热门词,正则表达式空格词

于 2013-03-18T08:54:56.960 回答
149

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

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

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

^\w+( \w+)*$

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

^匹配字符串的开头

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

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

$匹配字符串的结尾

于 2013-03-18T09:46:43.447 回答
33

这个对我有用

([\w ]+)
于 2014-01-13T22:48:34.130 回答
14

尝试:

^(\w+ ?)*$

解释:

\w             - alias for [a-zA-Z_0-9]
"whitespace"?  - allow whitespace after word, set is as optional
于 2013-03-18T08:55:00.553 回答
8

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

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

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

^\w[\w ]*\w$

另外:如果您故意将正则表达式表述为它也允许空字符串,则必须使整个内容可选:

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

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

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

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

于 2013-03-18T09:01:18.387 回答
5

这个正则表达式

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

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

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

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

这在开始时不允许空间。但允许单词之间有空格。还允许在单词之间使用特殊字符。FirstName 和 LastName 字段的良好正则表达式。

\w+.*$
于 2013-09-18T14:48:48.383 回答
2

仅适用于字母:

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

对于字母数字值和_

^(\w)+(\s)+\w+$
于 2016-08-25T12:05:11.447 回答
2

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

[a-zA-Z0-9_ ]
于 2018-09-20T12:19:48.573 回答
1

如果您使用的是 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

此正则表达式的唯一缺点是完全由空格组成的字符串。" " 也将显示为 true。

于 2021-04-29T20:03:26.520 回答
0

这是我的正则表达式:@"^(?=.{3,15}$)(?:(?:\p{L}|\p{N})[._()\[\]-]?)*$"

我刚刚([\w ]+)在我的正则表达式末尾添加了*

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

现在允许字符串有空格。

于 2020-09-15T03:47:55.603 回答
-1

试试这个:

result = re.search(r"\w+( )\w+", text)
于 2020-09-21T05:13:11.693 回答