【问题标题】:how to detect substring which has repeatitive characters? [duplicate]如何检测具有重复字符的子字符串? [复制]
【发布时间】:2021-03-13 10:30:02
【问题描述】:

我对 javascript 中的正则表达式有疑问。

我想检测一个字符串是否有一个包含重复字符或单词的子字符串。

例如,字符串“aaaaabcd”具有a或aa的重复子串

但字符串“abcdefghij”没有任何重复子字符串。

我在 javascript 中做了一个 RegExp 来检测它。

const written_contents = "aaaaaabcd"
const re = new RegExp("(\w+)\1{3,}", "g")
if (re.test(written_contents) ) {
    return "repetition detected."
}

我的意图是检测 3 个以上的相同单词或字符重复。

让我解释一下我达到那个正则表达式的逻辑

如果字符串是“aaaaaabc”,
\w+ 将捕获由 1+ 个字符组成的任何子集,例如 a、aa、aaa、b、c、aaab、aabc、aaabc。

(\w+)\1 \1 指向第一个括号。这里是 (\w)

而 {3, } 表示 \1 重复超过 3 次。

我给了“g”选项来搜索整个字符串。

现在我希望“aaaaa”被捕获,因为第一个 a 是 \w,第二个 a 是 \1,第三个 a 到第五个 a 是 {3,} 因此“aaaaa”匹配。

但是代码不起作用。

怎么了?

【问题讨论】:

  • 你必须在正则表达式构造函数(\\w+)\\1{3,}中对反斜杠进行双重转义,你可以写成const re = /(\w+)\1{3,}/g;
  • 我不完全明白,为什么\w+,如果你只想重复一个字符,而不是一个序列,但除此之外:why-do-regex-constructors-need-to-be-double-escaped
  • 感谢“第四只鸟”。我决定不使用 RegExp。 //更直接
  • 感谢 ASDFGerte。你的评论是对的。我把它改成 (.+)
  • 谢谢沙丁鱼。我采纳了你的建议,它成功了。

标签: javascript regex


【解决方案1】:

我发现了问题所在,但我仍然不知道为什么我之前的代码在 javascript 语法方面有问题。

const re = /(.+)\1{1,}/

if (re.test(written_contents) ) {
    return "repetition detected"
}

上面的代码有效。

奇怪的是,

re = new RegExp('(.+)\1{1,}')  

没用。

【讨论】:

  • 使用 RegExp 构造函数时应该转义 \ 符号。试试re = new RegExp('(.+)\\1{1,}')
  • @jong-hyeon-yeo 非常感谢。我觉得 / xxx / 比 RegExp() 表达式更方便,因为我不必按照您的建议使用转义 \ 符号。现在我明白为什么我以前的代码不起作用了。
猜你喜欢
  • 1970-01-01
  • 2015-10-11
  • 2011-07-25
  • 2019-06-07
  • 1970-01-01
  • 2021-04-29
  • 1970-01-01
  • 1970-01-01
  • 2020-09-20
相关资源
最近更新 更多