javascript - JS中的RegEx查找第3个相同的连续字符

标签 javascript regex regex-negation

如何在 JS 中使用正则表达式(可以是字母、数字和非字母数字)查找 3 个字符的序列,'abb' 有效而 'abbb' 无效。

这个问题是我在这里提出的问题的变体:How to combine these regex for javascript .

这是错误的: /(^([0-9a-zA-Z]|[^0-9a-zA-Z]))\1\1/ ,那么什么是正确的做法?

最佳答案

这取决于您的实际意思。如果你只想匹配三个不相同的字符(也就是说,如果 abb 对你有效),你可以使用这个否定先行:

(?!(.)\1\1).{3}

它首先断言,当前位置后面没有出现三次相同的字符。然后匹配这三个字符。

如果你真的想匹配 3 个不同的字符(只有像 abc 这样的东西),它会变得有点复杂。改用这两个否定前瞻:

(.)(?!\1)(.)(?!\1|\2).

首先匹配一个字符。然后我们断言,this 后面没有跟同一个字符。如果是这样,我们匹配另一个字符。然后我们断言这些字符后面既没有第一个字符也没有第二个字符。然后我们匹配第三个字符。

请注意,那些否定前瞻 ((?!...)) 不消耗任何字符。这就是为什么它们被称为先行。他们只是检查接下来会发生什么(或者在这种情况下,接下来不会会发生什么)然后正则表达式从它离开的地方继续。 Here是一个很好的教程。

另请注意,如果您使用 DOTALL 或 SINGLELINE 选项,这会匹配除换行符之外的任何内容,或者实际上任何内容。由于您使用的是 JavaScript,因此您可以通过在正则表达式结束分隔符 后附加 s 来激活该选项。如果(出于某种原因)您不想使用此选项,请将 . 替换为 [\s\S](这始终匹配任何字符)。

更新:

在评论中澄清后,我意识到您不想找到三个不相同的字符,而是想断言您的字符串>不包含三个相同(且连续)的字符。

这更容易一些,也更接近您之前的问题,因为它只需要一次否定前瞻。我们所做的是:我们从字符串的开头搜索三个连续的相同字符。但是因为我们想断言这些存在,所以我们将其包装在一个否定的前瞻中:

^(?!.*(.)\1\1)

前瞻锚定在字符串的开头,因此这是我们唯一要查找的地方。前瞻中的模式然后尝试从字符串中的任何位置找到三个相同的字符(因为 .*;相同字符的匹配方式与上一个问题相同)。如果模式找到这些,否定先行将因此失败,因此字符串将无效。如果找不到三个相同的字符,则内部模式永远不会匹配,因此否定先行会成功。

关于javascript - JS中的RegEx查找第3个相同的连续字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13101480/

相关文章:

javascript - 如何判断哪些后端文件与前端文件关联?

php - 任何 preg_match 来检查 url 是否是 youtube/vimeo/dailymotion 视频链接?

regex - 如何让 vim 突出显示任何 { 后面没有 C++ 风格的注释或两个换行符?

regex - 正则表达式:- String can contain any characters but should not be empty

java - 正则表达式用于匹配没有特定模式的数字

javascript - 如何将一种日期格式转换为另一种日期格式

javascript - 播放暂停按钮切换按钮

javascript - Chrome 扩展程序弹出窗口不起作用,点击事件未处理

javascript - 正则表达式 JavaScript

javascript - 替换子字符串和可选的后续字符