JS中的RegEx找到没有3个相同的连续字符
Posted
技术标签:
【中文标题】JS中的RegEx找到没有3个相同的连续字符【英文标题】:RegEx in JS to find No 3 Identical consecutive characters 【发布时间】:2012-10-17 13:52:36 【问题描述】:如何在 JS 中使用 Regex(可以是字母、数字和非字母数字)查找 3 个字符的序列,'abb' 有效而 'abbb' 无效。
这个问题是我在这里提出的问题的一个变体:How to combine these regex for javascript。
这是错误的:/(^([0-9a-zA-Z]|[^0-9a-zA-Z]))\1\1/
,那么正确的做法是什么?
【问题讨论】:
不,他想要的恰恰相反 @m.buettner 我明白了,错过了“否”,我将其读作“数字”的缩写 重复? ***.com/questions/8880088/… @GurpreetSingh,我不这么认为。您链接的问题专门关于连续字符 @m.buettner 我改写了第一句话。让我们希望我的编辑能够度过这段时间...... 【参考方案1】:这取决于您的实际意思。如果你只想匹配三个不相同的字符(也就是说,如果abb
对你有效),你可以使用这个否定的lookahead:
(?!(.)\1\1).3
它首先断言,当前位置后面不是三个相同的字符。然后它匹配这三个字符。
如果你真的想匹配 3 个不同的字符(只有像 abc
这样的东西),它会变得有点复杂。改用这两个否定的前瞻:
(.)(?!\1)(.)(?!\1|\2).
首先匹配一个字符。然后我们断言,this 后面不是同一个字符。如果是这样,我们匹配另一个字符。然后我们断言这些后面既不是第一个字符也不是第二个字符。然后我们匹配第三个字符。
请注意,那些负前瞻 ((?!...)
) 不会消耗任何字符。这就是为什么它们被称为前瞻。他们只是检查接下来会发生什么(或者在这种情况下,不接下来会发生什么),然后正则表达式从它离开的地方继续。 Here 是一个很好的教程。
还要注意,这匹配除换行符以外的任何内容,或者如果您使用 DOTALL 或 SINGLELINE 选项,则真正匹配 任何内容。由于您使用的是 JavaScript,您可以通过在正则表达式结束分隔符之后附加 s
来激活该选项。如果(出于某种原因)您不想使用此选项,请将.
s 替换为[\s\S]
(这始终匹配任何字符)。
更新:
在 cmets 中进行澄清后,我意识到您不想找到三个不相同的字符,而是要断言您的字符串确实 不包含三个相同(且连续)的字符。
这更容易,更接近您之前的问题,因为它只需要一个否定的前瞻。我们所做的是:我们从字符串的开头搜索三个连续的相同字符。但是由于我们想要断言这些确实不存在,我们将其包装在一个否定的前瞻中:
^(?!.*(.)\1\1)
lookahead 锚定在字符串的开头,所以这是我们将要查看的唯一位置。然后,前瞻中的模式尝试从字符串中的任何位置找到三个相同的字符(因为.*
;相同的字符以与上一个问题相同的方式匹配)。如果模式找到了这些,则负前瞻将因此失败,因此字符串将无效。如果找不到三个相同的字符,则内部模式永远不会匹配,因此否定前瞻将成功。
【讨论】:
感谢您提供如此清晰的答案。在我的情况下,'abb' 是有效的,而 'abbb' 不是。这个 '(?!(.)\1\1).3' 即使对于 'abbb' 也会返回 true 啊,好吧。我以为您想在字符串中find 3 个不相同的字符。但是您要断言,您的字符串永远不会包含三个相同的字符。然后我将编辑我的答案。【参考方案2】:要查找非三个相同的字符,请使用正则表达式模式
([\s\S])(?!\1\1)[\s\S]2
【讨论】:
好吧,那么我的英语可能缺乏了解这些细微差别。我认为这三个都需要彼此不同。 @Prinzhorn,在这种情况下,英语或至少 OP 的措辞相当含糊。但肯定有“三个不一样”和“三个不一样”的区别(abb
vs abc
)。以上是关于JS中的RegEx找到没有3个相同的连续字符的主要内容,如果未能解决你的问题,请参考以下文章