【问题标题】:How to combine these regex for javascript如何为 javascript 结合这些正则表达式
【发布时间】:2012-10-17 05:57:37
【问题描述】:

您好,我正在尝试在 JS 中使用 regEx 来识别 3 个相同的连续字符(可以是字母、数字以及所有非字母数字字符)

这标识了 3 个相同的连续字母和数字:'(([0-9a-zA-Z])\1\1)'
这标识了 3 个相同的连续非字母数字:'(([^0-9a-zA-Z])\1\1)'

我正在尝试将两者结合起来,如下所示:'(([0-9a-zA-Z])\1\1)|(([^0-9a-zA-Z])\1\1) '

但是我做错了什么并且它不起作用..(为 '88aa3BBdd99@@' 返回 true)

编辑:要找到 NO 3 个相同的字符,这似乎是错误的 /(^([0-9a-zA-Z]|[^0-9a-zA-Z])\1\1)/ - -> RegEx in JS to find No 3 Identical consecutive characters

谢谢 诺西布

【问题讨论】:

    标签: java javascript regex jakarta-ee


    【解决方案1】:

    问题是在整个正则表达式中,反向引用是从左到右计算的。所以如果你把它们结合起来,你的数字就会改变:

    (([0-9a-zA-Z])\2\2)|(([^0-9a-zA-Z])\4\4)
    

    您也可以删除外部括号:

    ([0-9a-zA-Z])\1\1|([^0-9a-zA-Z])\2\2
    

    或者您可以只在一组括号中捕获备选方案,并将一个反向引用附加到末尾:

    ([0-9a-zA-Z]|[^0-9a-zA-Z])\1\1
    

    但由于你的字符类匹配所有个字符,你也可以这样:

    ([\s\S])\1\1
    

    如果您激活 DOTALL 或 SINGLELINE 选项,您可以改用 .

    (.)\1\1
    

    【讨论】:

    • @m.buettner:我怎样才能否定整个 expr:找到没有 3 个相同的连续字符?这似乎是错误的: /(^([0-9a-zA-Z]|[^0-9a-zA-Z]))\1\1/
    • @Nohsib,我建议你问一个新问题,因为这稍微复杂一些。但是,只是为了让您知道,您不能只使用^ 来否定任意模式。这仅适用于字符类。
    • @m.buettner:谢谢,这里是:stackoverflow.com/questions/13101480/…
    【解决方案2】:

    实际上要简单得多:

    (.)\1\1

    (.) 匹配任何字符,每个\1 都是一个反向引用,与第一个捕获组匹配的确切字符串匹配。您应该知道 . 实际匹配的内容,然后修改组(在括号中)以满足您的确切需求。

    【讨论】:

    • 这需要DOTALL选项等效
    猜你喜欢
    • 1970-01-01
    • 2018-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-19
    相关资源
    最近更新 更多