我正在努力编写一个符合以下要求的正则表达式:1.最多20个字符(英语字母和数字)1.可以有一个可选的破折号(-),但不能以它开头或结尾我可以想出这样的模式:^[a-zA-Z0-9-]{0,20}$,但这个允许多个破折号,并且可以在输入字符串的开始/结束处输入破折号。
^[a-zA-Z0-9-]{0,20}$
wljmcqd81#
您可以使用
^(?=.{0,20}$)(?:[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)?)?$
请参阅regex demo。
^
(?=.{0,20}$)
(?:
[a-zA-Z0-9]+
(?:-[a-zA-Z0-9]+)?
-
)?
$
siotufzp2#
试一下:
^(?:[^\W_]{1,20}|(?!.{22})[^\W_]+-[^\W_]+)$
查看在线demo
[^\W_]{1,20}
|
(?!.{22})[^\W_]+-[^\W_]+
)$
请注意,以上假设最多20个字母数字字符,但有一个可选的连字符,这将使最大计数为21个字符。
xe55xuns3#
另 一 个 想法 是 用 一 个 lookahead 和 一 个 word boundary 结尾 。
^(?!.{21})[A-Za-z\d]+-?[A-Za-z\d]*\b$
中 的 每 一 个
^(?!.{21})
[A-Za-z\d]+
-?[A-Za-z\d]*
\b$
See this demo at regex101 格式仅 供 参考 : 如果 \pL ( * letter * ) 可 用于 缩短 :^(?!.{21})[\pL\d]+-?[\pL\d]*\b$ 格式
\pL
^(?!.{21})[\pL\d]+-?[\pL\d]*\b$
3条答案
按热度按时间wljmcqd81#
您可以使用
请参阅regex demo。
^
-字符串开始(?=.{0,20}$)
-字符串中允许0到20个字符(?:
-非捕获组开始:[a-zA-Z0-9]+
-一个或多个字母数字字符(?:-[a-zA-Z0-9]+)?
--
和一个或多个字母数字字符的可选序列)?
-非捕获组的结尾,重复一次或零次(即模式匹配是可选的)$
-字符串结束。siotufzp2#
试一下:
查看在线demo
^
-起点锚;(?:
-打开非捕获组;[^\W_]{1,20}
-匹配1-20个字母数字字符;|
-或;(?!.{22})[^\W_]+-[^\W_]+
-Assert位置的负预视后面没有22个字符,接下来我们在连字符之间匹配1+个字母数字字符;)$
-在匹配行尾锚之前关闭非捕获组请注意,以上假设最多20个字母数字字符,但有一个可选的连字符,这将使最大计数为21个字符。
xe55xuns3#
另 一 个 想法 是 用 一 个 lookahead 和 一 个 word boundary 结尾 。
中 的 每 一 个
^(?!.{21})
* lookahead * 在 开始 时 最 多 检查 20 个 字符[A-Za-z\d]+
-?[A-Za-z\d]*
optional 连 字符 后跟 任意 数量 的 铝\b$
* 单词 边界 * 强制 以 字母 数字 字符 结束See this demo at regex101 格式
仅 供 参考 : 如果
\pL
( * letter * ) 可 用于 缩短 :^(?!.{21})[\pL\d]+-?[\pL\d]*\b$
格式