【问题标题】:Regex to match first character and no more than 2 identical consecutives正则表达式匹配第一个字符且不超过 2 个相同的连续字符
【发布时间】:2016-05-16 21:57:48
【问题描述】:

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

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

我的正则表达式是这样的:

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

当我在 regexr.com 中对其进行测试时,它似乎有效,但是当我在我的页面中对其进行测试时,只有第一个字符匹配的部分有效,其余部分无效。当我输入“Aaaaron”之类的内容时,没有显示“无效条目”的消息。

提前致谢。

【问题讨论】:

  • 也许因为你启用了/i 标志,它可以在在线正则表达式测试器上工作?

标签: javascript jquery regex html


【解决方案1】:

说明

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

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

  • 捕获第一个字符
  • 验证第一个字符不再重复 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
----------------------------------------------------------------------

【讨论】:

    【解决方案2】:

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

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

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

    jsfiddle

    注释:

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

    【讨论】:

    • 仍然没有显示无效条目的消息,但这似乎是正确的正则表达式。你知道可能是什么原因吗?我正在使用 HTML5+CSS3 验证器(输入:有效,输入:无效),但该消息仅在我最初输入错误字母时显示,但在我输入连续相同时不显示。
    • 你能创建一个jsfiddle.net 来说明这个错误吗? (您可以将 jquery 添加为外部库)
    • 现在即使我输入了一个有效的字符串也会显示消息:(
    • 知道了。您需要双重转义反向引用\\1 以允许它们通过字符串处理和正则表达式处理。
    猜你喜欢
    • 1970-01-01
    • 2018-12-17
    • 2012-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多