Regex 正则表达式-在整个字符串中查找多个破折号。。。还有一点

Regex 正则表达式-在整个字符串中查找多个破折号。。。还有一点,regex,Regex,所以我对RegEx很讨厌。。。你能帮我做以下事情吗 总共只允许52个字符 只有“a-z”、“a-z”、“0-9”和“-”(字母、数字和破折号) 不以“-”(破折号)开头 不以“-”(破折号)结尾 没有“-”(两个连续破折号在一起) 整个字符串中没有超过2“-”(破折号)(这就是我遇到的问题) 下面是一个有用的列表(我想): 这是我目前拥有的,但您可以随意更改: (?!.*--)^[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,50}[a-zA-Z0-9])?$ 我相信有更好的方法

所以我对RegEx很讨厌。。。你能帮我做以下事情吗

  • 总共只允许52个字符
  • 只有“a-z”、“a-z”、“0-9”和“-”(字母、数字和破折号)
  • 不以“-”(破折号)开头
  • 不以“-”(破折号)结尾
  • 没有“-”(两个连续破折号在一起)
  • 整个字符串中没有超过2“-”(破折号)(这就是我遇到的问题)
下面是一个有用的列表(我想):

这是我目前拥有的,但您可以随意更改:

(?!.*--)^[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,50}[a-zA-Z0-9])?$
我相信有更好的方法可以做到这一点,但如上所述,我对表情很反感。我的表达式有效,只找到了两个破折号

谢谢您的帮助。

您可以使用以下风味正则表达式:

/^(?!.*\-\-)(?!.*\-.+\-.*\-)(?!-)[a-z0-9-]{0,52}(?<!-)$/gmi
并不是说
\A
\z
是线锚的起点和终点,而
^
$
是线锚的起点和终点。将此正则表达式中的负lookaheads与前面的正则表达式中的负lookaheads进行比较


如果重要的话,这将匹配空字符串。

您可以在正向前瞻中使用最多52个字符的断言

然后匹配1次或多次
[a-zA-Z0-9]+
,并重复0、1、2次或多次前面带有
-

^(?=[a-zA-Z0-9-]{1,52}$)[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+){0,2}$
解释

  • ^
    行的开头
  • (?=
    正向前瞻,断言右边的是
    • [a-zA-Z0-9-]{1,52}$
      匹配列出的任何1-52次并断言字符串的结尾
  • 关闭前瞻
  • [a-zA-Z0-9]+
    将列出的任何一项匹配1+次,以防止匹配空字符串
  • (?:
    非捕获组
    • -[a-zA-Z0-9]+
      匹配
      -
      并将不带
      -
  • ){0,2}
    关闭组并重复0-2次
  • $
    行尾

这个正则表达式(
^[a-z0-9]+([a-z0-9]+{0,2}$
)基本上满足了您的要求:唯一几乎不可能解决的部分是52个字符的限制。您可以在正则表达式中添加另一个负前瞻:
(?!(.-{3,})
@Nick谢谢!我一直在尝试(?。*-{3,})。。。再次感谢你@马克:括号的乐趣!:-)它应该允许最多50个字符还是正好50个字符?并非所有浏览器都支持“反向查找”功能。不确定这是否是一个主要问题?大多数正则表达式引擎支持固定长度的lookbehind(请参阅语言功能,第1部分),但如果您使用的是不支持固定长度的lookbehind,则可以删除
(?!-)
,并将
(?!-)
更改为
(?!-|*-$)
/
^                    # match beginning of line
(?!.*\-\-.*$)        # the line may not contain two consecutive hyphens
(?!.*\-.*\-.*\-.*$)  # the line may not contain more than two hyphens
(?!-)                # the first char cannot be a hyphen               
[a-z0-9-]{0,52}      # match 0-52 letters, digits and hyphens
(?<!-)               # the last char cannot be a hyphen
$                    # match end of the line
/xgmi                # free-spacing, global, multiline, case indifferent modes
\A(?!.*\-\-)(?!.*\-.+\-.*\-)(?!-)[a-z0-9-]{0,52}(?<!-)\z
^(?=[a-zA-Z0-9-]{1,52}$)[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+){0,2}$