RegEx:匹配20个字母与1个可选破折号

ajsxfq5m  于 2022-11-18  发布在  其他
关注(0)|答案(3)|浏览(184)

我正在努力编写一个符合以下要求的正则表达式:
1.最多20个字符(英语字母和数字)
1.可以有一个可选的破折号(-),但不能以它开头或结尾
我可以想出这样的模式:^[a-zA-Z0-9-]{0,20}$,但这个允许多个破折号,并且可以在输入字符串的开始/结束处输入破折号。

wljmcqd8

wljmcqd81#

您可以使用

^(?=.{0,20}$)(?:[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)?)?$

请参阅regex demo

  • 详细数据 *:
  • ^-字符串开始
  • (?=.{0,20}$)-字符串中允许0到20个字符
  • (?:-非捕获组开始:
  • [a-zA-Z0-9]+-一个或多个字母数字字符
  • (?:-[a-zA-Z0-9]+)?--和一个或多个字母数字字符的可选序列
  • )?-非捕获组的结尾,重复一次或零次(即模式匹配是可选的)
  • $-字符串结束。
siotufzp

siotufzp2#

试一下:

^(?:[^\W_]{1,20}|(?!.{22})[^\W_]+-[^\W_]+)$

查看在线demo

  • ^-起点锚;
  • (?:-打开非捕获组;
  • [^\W_]{1,20}-匹配1-20个字母数字字符;
  • |-或;
  • (?!.{22})[^\W_]+-[^\W_]+-Assert位置的负预视后面没有22个字符,接下来我们在连字符之间匹配1+个字母数字字符;
  • )$-在匹配行尾锚之前关闭非捕获组

请注意,以上假设最多20个字母数字字符,但有一个可选的连字符,这将使最大计数为21个字符。

xe55xuns

xe55xuns3#

另 一 个 想法 是 用 一 个 lookahead 和 一 个 word boundary 结尾 。

^(?!.{21})[A-Za-z\d]+-?[A-Za-z\d]*\b$

中 的 每 一 个

  • ^(?!.{21}) * lookahead * 在 开始 时 最 多 检查 20 个 字符
  • one or more 字母 数字 字符 开头 的 [A-Za-z\d]+
  • -?[A-Za-z\d]*optional 连 字符 后跟 任意 数量 的 铝
  • \b$ * 单词 边界 * 强制 以 字母 数字 字符 结束

See this demo at regex101 格式
仅 供 参考 : 如果 \pL ( * letter * ) 可 用于 缩短 :^(?!.{21})[\pL\d]+-?[\pL\d]*\b$ 格式

相关问题