RegEx Javascript-整个字符串中只有0-2个空格或连字符



我有以下简单的正则表达式:
/^[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]+$/
^++++++++++++++^       ^^

所以,

  1. s被添加到表达式中,以便它可以匹配空白
  2. (?!(?:S*s){3})确保字符串中不会出现三个或三个以上的空白字符(由于S*的存在,两者之间可能存在任何非空白字符(

需要考虑的更多事项

要在开始和结束处禁止空格,请添加更多lookahead

/^(?!s)(?!.*s$)(?!(?:S*s){3})[a-zA-Zsu00c4u00e4u00d6u00f6u00dcu00fcu00df]+$/
^+++++++++++++^

也不允许连续空格

/^(?!s)(?!.*s$)(?!.*s{2})(?!(?:S*s){3})[a-zA-Zsu00c4u00e4u00d6u00f6u00dcu00fcu00df]+$/
^+++++++++^

最新更新