正则表达式 - 不重复句号、逗号和连字符

Regex - No repeation of period and comma and hyphen

我正在尝试为地址创建一个正则表达式。

我目前有 [a-zA-Z0-9-\.\-\,\-\s\n],但它匹配重复句号、重复连字符和重复逗号。有什么方法可以将逗号、连字符和句点的数量限制为 1 个?

它应该匹配 "5432 Lorem St. Tokyo, Japan 1234-54"

它不应该匹配 "5323 Dolor Ave... Kyoto,,,, Japan 555-33----33"

[^a-zA-Z0-9-\.-\,\-\s\n][a-zA-Z0-9-\.-\,\-\s\n][^a-zA-Z0-9-\.-\,\-\s\n]

是冗长的,但会匹配那些没有(^)的元素中的一个在它的任何一侧都有另一个。那是你想要的吗?

要禁止 "comma"、"dot" 或 "hyphen" 集中的重复字符,您可以使用锚定在开头的否定前瞻:

/^(?!.*([.,-]))[a-zA-Z0-9\s.,-]+$/.test(str)
  ^^^^^^^^^^^^^^^

(?!.*([.,-])) 前瞻检查是否存在重复的逗号、点或连字符(参见 ([.,-]) - 捕获组后跟反向引用),如果找到则匹配失败。

此外,要禁止部分匹配,锚点 - ^ 用于字符串的开头和 $ 用于字符串的结尾 - 是必需的。

这样的怎么样?

^([a-zA-Z0-9\s\n]|(([\.,-])(?!)))*$

因此,这会匹配任何仅包含任意数量的字母、数字、空格或行空格或句点、逗号或连字符的字符串,而这些字符串本身并没有紧跟其后。