正则表达式 - 防止双空格

4

我有一个用于姓名字段的大型正则表达式,看起来像这样。

^(?:(?!(?:.*[ ]){2})(?!(?:.*[']){2})(?!(?:.*[-]){2})(?:[a-zA-Z0-9 \p{L}'-]{3,48}$))$

我不是正则表达式专家,通过Stackoverflow和RegexBuddy的帮助才能做到这一步。但是有一行让我有些困惑,就是第一个正向先行断言(?!(?:.*[ ]){2}),它防止出现多个空格。

这并不完全符合我的需求。我只想确保不能出现连续的多个空格,如双倍空格等。这个正则表达式防止整个字符串中出现超过1个空格。

我一直在尝试弄清楚如何更改它,但我真的感到困惑。是否有任何方法来在正则表达式的其余部分中实现这样的概念呢?

这将在C#中执行。

1个回答

5

(?!(?:.*[ ]){2}) 替换为 (?!.*[ ]{2})

解释:

(?:.*[ ]){2} 先匹配一个空格,该空格前面是零个或多个其他字符((?:.*[ ])),然后重复两次({2})。

.*[ ]{2} 匹配两个连续的空格,该空格前面是零个或多个其他字符。


是的,这确实起作用了。不过我不明白为什么会这样。能不能再麻烦您解释一下呢? - Ciel
是的,现在有意义了。所以 (?: 是告诉它限制特定表达式可以被评估的次数,但将其全部放在 (?! 中会将其更改为匹配整个字符串中的序列,而不仅仅是检查一些空格的数量。非常感谢!当 SO 的时间限制允许时,我会点击接受。 - Ciel
@Ciel,啊,(?: ... )让你感到困惑了。看一下这个页面,了解一下( ... )(?: ... )之间的区别。不用谢! - Bart Kiers

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