Regex 正则表达式-在整个字符串中查找多个破折号。。。还有一点
所以我对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])?$ 我相信有更好的方法
- 总共只允许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}$
解释
行的开头^
正向前瞻,断言右边的是(?=
匹配列出的任何1-52次并断言字符串的结尾[a-zA-Z0-9-]{1,52}$
关闭前瞻)
将列出的任何一项匹配1+次,以防止匹配空字符串[a-zA-Z0-9]+
非捕获组(?:
匹配-[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}$