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

law*_*tog 164 regex space alphanumeric

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

^[a-zA-Z0-9_]*$
Run Code Online (Sandbox Code Playgroud)

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

如何调整它以允许空格?

And*_*ong 312

TL;博士

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

^[a-zA-Z0-9_ ]*$
Run Code Online (Sandbox Code Playgroud)

 


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

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

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

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

...使用@stema的答案.

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

^[a-zA-Z0-9_]+( [a-zA-Z0-9_]+)*$
Run Code Online (Sandbox Code Playgroud)

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

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

  • 如果你想允许多个空格字之间(比方说,如果你想允许偶然的双空格,或者如果你有从PDF复制粘贴的文本工作),然后添加一个+空格之后:

    ^\w+( +\w+)*$
    
    Run Code Online (Sandbox Code Playgroud)
  • 如果要允许制表符和换行符(空格字符),则用以下内容替换空格\s+:

    ^\w+(\s+\w+)*$
    
    Run Code Online (Sandbox Code Playgroud)

    +默认情况下,我建议使用,例如,Windows换行符按顺序包含两个空白字符\r\n,因此您需要+同时捕获这两个字符.

还是行不通?

检查您正在使用的正则表达式的方言.*在像Java这样的语言中,你必须逃避你的反斜杠, \\w\\s.在较旧的或更基本的语言和实用程序中,例如sed,\w并且\s未定义,因此请分别使用字符类(例如 [a-zA-Z0-9_]和)来写出它们[\f\n\p\r\t].

 


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

  • 它允许空字符串 (3认同)
  • @Pierre - 接受人工指令并将其转换为明确的规则是相当困难的。(人类的语言是流动的,充满了歧义,我们的大脑完成了解决问题和填补空白所需的大部分工作。计算机没有这样的大脑,模仿大脑的聪明尝试还不够强大。 ) 确实存在像 https://www.debuggex.com/ 这样的工具,可以直观地表示您的正则表达式,但尽管如此吸引人,但对于完整的初学者来说可能不是很有帮助。但是,我建议使用 [交互式教程](http://regexone.com/) 来了解基础知识。 (2认同)

ste*_*ema 106

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

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

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

^\w+( \w+)*$
Run Code Online (Sandbox Code Playgroud)

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

^ 匹配字符串的开头

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

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

$ 匹配字符串的结尾


Mar*_*rez 23

这个对我有用

([\w ]+)
Run Code Online (Sandbox Code Playgroud)

  • 这个答案缺乏解释。 (5认同)

hsz*_*hsz 10

试试:

^(\w+ ?)*$
Run Code Online (Sandbox Code Playgroud)

说明:

\w             - alias for [a-zA-Z_0-9]
"whitespace"?  - allow whitespace after word, set is as optional
Run Code Online (Sandbox Code Playgroud)

  • 这样会引起回溯。 (2认同)
  • 例如,给定一个不匹配的字符串`gggggggggggggggggggggggggggggggggggggg;`,由于过度回溯,您的正则表达式将需要很长时间才能达到结果。 (2认同)

cre*_*nig 8

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

^[a-zA-Z0-9_][a-zA-Z0-9_ ]*[a-zA-Z0-9_]$
Run Code Online (Sandbox Code Playgroud)

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

^\w[\w ]*\w$
Run Code Online (Sandbox Code Playgroud)

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

^(\w[\w ]*\w)?$
Run Code Online (Sandbox Code Playgroud)

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

^((\w+ )*\w+)?$
Run Code Online (Sandbox Code Playgroud)

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


Kay*_*ayV 6

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

[a-zA-Z0-9_ ]
Run Code Online (Sandbox Code Playgroud)


Ama*_*hez 5

这个正则表达式

^\w+(\s\w+)*$
Run Code Online (Sandbox Code Playgroud)

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

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

  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. $ 断言字符串末尾的位置