正则表达式匹配第一个字符和不超过2个相同的连续

时间:2016-05-16 21:57:49

标签: javascript jquery regex html5

我使用jQuery根据我从数组中选择的字母将模式属性添加到文本字段。我尝试使用正则表达式限制文本字段可以接受的值,但它无法正常工作。

我想要的是值的第一个字符必须是我选择的数组字母,然后不要接受超过2个相同的连续字符。

我的正则表达是:

^["+letter+"](?!(.)\1).{2}.*

当我在regexr.com上测试它时它似乎有效,但是当我在我的页面中测试它时,只有匹配的部分第一个字符串工作,其余的没有。当我输入类似" Aaaaron"之类的信息时,"无效输入"没有显示。

提前致谢。

2 个答案:

答案 0 :(得分:1)

描述

^(.)(?!\1{2})

Regular expression visualization

此正则表达式将执行以下操作:

  • 捕获第一个字符
  • 验证第一个字符然后不再重复2次。如果在第一次出现后还有两个相同的字符,则连续有3个相同的字符。

注意,要使此表达式将字母的大写和小写版本视为同一字符,您需要使用不区分大小写的标记。

实例

https://regex101.com/r/xG9mE9/2

解释

NODE                     EXPLANATION
----------------------------------------------------------------------
  ^                        the beginning of a "line"
----------------------------------------------------------------------
  (                        group and capture to \1:
----------------------------------------------------------------------
    .                        any character except \n
----------------------------------------------------------------------
  )                        end of \1
----------------------------------------------------------------------
  (?!                      look ahead to see if there is not:
----------------------------------------------------------------------
    \1{2}                    what was matched by capture \1 (2 times)
----------------------------------------------------------------------
  )                        end of look-ahead
----------------------------------------------------------------------

答案 1 :(得分:1)

试试这个正则表达式:(字母为'a')

$("form").find("input[type=text]").attr("pattern", "(?=[Aa])(?!.*(.)\\1\\1).*");

它验证了起始字母,并且没有字符连续出现超过2次:

jsfiddle

注释:

  • can't do case insensitive matching有HTML5模式属性,所以'a'和'A'不是一回事('Aaaron'不是连续3个)
  • 如果在jquery / javascript中通过字符串(不是正则表达式文字)添加模式,请记住首先是字符串插值然后再使用正则表达式插值(反斜杠意味着字符串以及Regex,你可能需要双重转义它们: (\\1在这种情况下进行反向引用)
  • 您不需要^$来使输入值仅与整个模式匹配,正则表达式将包含在^(?:regex)$中。这意味着,如果您的模式不消耗整个字符串,它将无法工作:(?=[Aa])(?!.*(.)\\1\\1),这只是几个外观,并且通常会验证输入正常,是零-width模式,最后没有.*,不起作用。