在 html5 模式中使用负后视和前视

Using negative lookbehind and lookahead in html5 pattern

我已经尝试查看大量关于如何在我的 html5 模式的正则表达式函数中使用负后视和先行的正则表达式指南。

我正在尝试匹配以下模式,其中字符串必须以 [a-z] 字母开头和结尾。该字符串最长可达 30 个字符。也可以包含符号:-,但它不能连续包含一个以上的 -

太好了,到目前为止我想到的是:

^[a-z][a-z(?<!-(-)?!-)]{0,28}[a-z]$

现在我无法获得前瞻和后视,因此无法正常工作,我不太确定我是否正确实现了最多 30 个字符。但是,我尝试以 [a-z] 开始和结束,但效果很好。

一些示例字符串:

'a-b' => true
'a-' => false
'-a' => false
'a--b' => false
'ab-cd' => true
'abc' => true
'a-b-c' => true

您需要使用

^(?!.{31})[a-z]+(?:-[a-z]+)*$

regex demo

请注意,在 HTML5 pattern 属性中,通常不需要锚点,因为默认情况下模式在两侧都锚定。

详情

  • ^ - 字符串开头
  • (?!.{31}) - 除了换行字符外不能有 31 个字符(这个 (?!...) 是一个否定的前瞻,如果它的模式匹配则匹配失败)(你也可以使用正前瞻- (?=.{1,30}$) - 字符串中需要 1 到 30 个字符)
  • [a-z]+ - 1 个或多个小写 ASCII 字母
  • (?:-[a-z]+)* - 零个或多个序列:
    • - - 一个连字符
    • [a-z]+ - 1 个或多个小写 ASCII 字母
  • $ - 字符串结尾。

您可以使用这种模式:

([a-z]|\b-\b){1,30}

单词边界防止连字符连续或在字符串限制处。

请注意,模式属性中不需要 ^$,因为它们是隐式的。

demo