我有以下简单的正则表达式:/^[a-zA-Zu00c4u00e4u00d6u00f6u00dcu00fcu00df]+$/
我想让字符串成为可能,比如";Blabla Bla bshfkhsf";。但整个字符串的空格或连字符不应超过2个。
我知道,我可以用";\s{0,2}";,但是我该如何设置这样的限制在regex中,这样像上面这样的字符串是可能的,并且限制适用于整个字符串,而不是";单个";性格
编辑:这可以吗:
^[a-zA-Zu00c4u00e4u00d6u00f6u00dcu00fcu00df]+((s)|(-))?[a-zA-Zu00c4u00e4u00d6u00f6u00dcu00fcu00df]+((s)|(-))?[a-zA-Zu00c4u00e4u00d6u00f6u00dcu00fcu00df]+$
有更好的方法吗?
如果不想只匹配空格,可以匹配第一个部分,然后使用量词{0,2}
重复整个部分,前面再加一个字符类[s-]
,以匹配空白字符或连字符。
如果它应该只是一个空白字符,那么您可以使用一个单独的s
(也可以匹配换行符(
注意在您的模式中,整个交替((s)|(-))?
是可选的,因此在这种情况下,单个匹配的最小长度为3个字符。请参见此示例。
你可以将模式更新为
^[a-zA-Zu00c4u00e4u00d6u00f6u00dcu00fcu00df]+(?:[s-][a-zA-Zu00c4u00e4u00d6u00f6u00dcu00fcu00df]+){0,2}$
解释
^
字符串开始[a-zA-Zu00c4u00e4u00d6u00f6u00dcu00fcu00df]+
匹配所列任意一个的1+次(?:
非捕获组[s-]
匹配whitspace字符或-
[a-zA-Zu00c4u00e4u00d6u00f6u00dcu00fcu00df]+
匹配1次以上列出的任何一次
){0,2}
关闭群组并重复0-2次$
字符串末尾
查看regex演示
不需要重复整个字符类,只需使用lookahead来组合条件:
/^(?=[^s-]*([s-][^s-]*){0,2}$)[a-zA-Zu00c4u00e4u00d6u00f6u00dcu00fcu00dfs-]+$/
Regex 101演示。它本质上是两个正则表达式合一:
(?=[^s-]*([s-][^s-]*){0,2}$)
这部分检查整个字符串是否满足"不超过2个空格或字符"规则。
[a-zA-Zu00c4u00e4u00d6u00f6u00dcu00fcu00dfs-]+$
这部分检查整个字符串是否满足"仅字母、空格和连字符"规则。关键是,只有当两项检查都通过时,整个模式才匹配
在解析您的需求时,您需要匹配一个不能有三个或更多空格的字符串。
使用
/^(?!(?:S*s){3})[a-zA-Zsu00c4u00e4u00d6u00f6u00dcu00fcu00df]+$/
^++++++++++++++^ ^^
所以,
s
被添加到表达式中,以便它可以匹配空白(?!(?:S*s){3})
确保字符串中不会出现三个或三个以上的空白字符(由于S*
的存在,两者之间可能存在任何非空白字符(
需要考虑的更多事项
要在开始和结束处禁止空格,请添加更多lookahead
/^(?!s)(?!.*s$)(?!(?:S*s){3})[a-zA-Zsu00c4u00e4u00d6u00f6u00dcu00fcu00df]+$/
^+++++++++++++^
也不允许连续空格
/^(?!s)(?!.*s$)(?!.*s{2})(?!(?:S*s){3})[a-zA-Zsu00c4u00e4u00d6u00f6u00dcu00fcu00df]+$/
^+++++++++^