ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

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

如何调整它以允许空间?


s
slackwing

tl;博士

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

^[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 这样的语言中,您必须转义反斜杠,ie \\w\\s。在较旧或更基本的语言和实用程序中,例如 sed\w\s 未定义,因此请使用字符类将它们写出来,eg [a-zA-Z0-9_][\f\n\p\r\t],分别。

* 我知道这个问题被标记为 ,但根据超过 25,000 次浏览,我猜不仅仅是那些人遇到这个问题。目前它是谷歌搜索词组的第一个热门词,正则表达式空格词


它允许空字符串
哇,好简单!谢谢。没有网站或可以用来生成正则表达式的东西吗,对于菜鸟,我的意思是......
@Pierre - 接受人工指令并将其转换为明确的规则是相当困难的。 (人类语言是流动的,充满歧义,我们的大脑完成了解决问题和填补空白所需的大部分工作。计算机没有这样的大脑,模仿大脑的聪明尝试还不够强大。 ) 确实存在像 debuggex.com 这样的工具可以直观地表示您的正则表达式,但尽管它很吸引人,但对于完全的初学者来说可能不是很有帮助。不过,我建议使用 interactive tutorial 来了解基础知识。
是的,如果只有空格,您的正则表达式也会匹配。我的回复是对 Neha choudary 的评论。
@Pierre 三年后——我今天遇到了这个问题,看到了你的评论;我使用 regex hero (regexhero.net) 来测试正则表达式。我认为在线版本仅适用于带有 Silverlight 的 Internet Explorer,但总比没有好。
A
Alan Moore

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

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

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

^\w+( \w+)*$

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

^ 匹配字符串的开头

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

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

$ 匹配字符串的结尾


这:regex101.com/#javascript 还为您要分析的正则表达式模式提供了很好的解释。
不错的正则表达式,比很多 [0-9a-z] 等要简单得多
我在我的正则表达式解释器中发现我需要将整个字符串包装在括号中,以便第一个匹配是整个字符串,而不仅仅是第一个空格之后的单词。那是 ^- (\w+( \w+)*)$ 为我工作。
K
KatieK

这个对我有用

([\w ]+)

这个答案缺乏解释。
h
hsz

尝试:

^(\w+ ?)*$

解释:

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

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

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

^[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:感谢您的评论。我猜我一般都习惯于匹配空格。答案是固定的。
您是否可能在第一个表达式中缺少右括号)?我不确定我没有尝试过。
@ssinfod:很好。实际上,在该示例中,左括号是多余的。谢谢。
请注意,此答案不会匹配单个字符串(它将匹配至少两个字符)。要解决此问题,您可以为单个字符添加测试:^\w$|^\w[\w ]*\w$
A
Amadeus Sánchez

这个正则表达式

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

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

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

在字符串开头断言位置 \w+ 匹配任何单词字符 [a-zA-Z0-9_] 量词:+ 一次到无限次之间,尽可能多次,根据需要返回 [greedy] 1st Capturing group (\ s\w+)* 量词:* 在零次和无限次之间,尽可能多次,按需回馈 [greedy] \s 匹配任意空白字符 [\r\n\t\f] \w+ 匹配任意单词字符[a-zA-Z0-9_] 量词:+ 一次和无限次之间,尽可能多次,根据需要返回 [greedy] $ 在字符串末尾断言位置


K
KayV

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

[a-zA-Z0-9_ ]

这与 accepted answer 有何不同?
j
jaxxbo

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

\w+.*$

这个答案不正确/不准确。此模式匹配一个或多个字母数字、下划线,然后是零个或多个任何非换行符。对OP没有好处。
A
Alan Moore

仅适用于字母:

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

对于字母数字值和 _

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

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

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


M
Masoud Darvishian

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

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

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

现在允许字符串有空格。


Z
Zahra Badri

此正则表达式仅允许字母和空格:

^[a-zA-Z ]*$

b
biddut

试试这个:

result = re.search(r"\w+( )\w+", text)