在 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]+)*$
请注意,在 HTML5 pattern 属性中,通常不需要锚点,因为默认情况下模式在两侧都锚定。
详情
^
- 字符串开头
(?!.{31})
- 除了换行字符外不能有 31 个字符(这个 (?!...)
是一个否定的前瞻,如果它的模式匹配则匹配失败)(你也可以使用正前瞻- (?=.{1,30}$)
- 字符串中需要 1 到 30 个字符)
[a-z]+
- 1 个或多个小写 ASCII 字母
(?:-[a-z]+)*
- 零个或多个序列:
-
- 一个连字符
[a-z]+
- 1 个或多个小写 ASCII 字母
$
- 字符串结尾。
您可以使用这种模式:
([a-z]|\b-\b){1,30}
单词边界防止连字符连续或在字符串限制处。
请注意,模式属性中不需要 ^
和 $
,因为它们是隐式的。
我已经尝试查看大量关于如何在我的 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]+)*$
请注意,在 HTML5 pattern 属性中,通常不需要锚点,因为默认情况下模式在两侧都锚定。
详情
^
- 字符串开头(?!.{31})
- 除了换行字符外不能有 31 个字符(这个(?!...)
是一个否定的前瞻,如果它的模式匹配则匹配失败)(你也可以使用正前瞻-(?=.{1,30}$)
- 字符串中需要 1 到 30 个字符)[a-z]+
- 1 个或多个小写 ASCII 字母(?:-[a-z]+)*
- 零个或多个序列:-
- 一个连字符[a-z]+
- 1 个或多个小写 ASCII 字母
$
- 字符串结尾。
您可以使用这种模式:
([a-z]|\b-\b){1,30}
单词边界防止连字符连续或在字符串限制处。
请注意,模式属性中不需要 ^
和 $
,因为它们是隐式的。