【问题标题】:How to match a self repeating pattern using regex [duplicate]如何使用正则表达式匹配自重复模式[重复]
【发布时间】:2019-10-27 13:02:37
【问题描述】:

我想知道是否可以使用正则表达式在另一个字符串中查找所有重复字符串的出现

举个简单的例子,在 aaaaaaaaaaaaaaa 中找到 aaa

如果我计算正确,它发生了 13 次,所以找到 13 次而不是 5 次的答案会很好。

另一个例子

abcabcabc 在 abcabcabcabc 中重复 3 次

【问题讨论】:

  • 您在这里使用的是编程语言,还是这更像是一个抽象的正则表达式问题?
  • 只是将模式包含在一个组中并放置一个量词? (abc)+ 虽然不会显式输出 number 的重复次数。取决于您在哪里使用它 - 在编程语言中,您可能能够匹配模式 ibce 直到用完所有匹配项,因此您必须保留一个计数器。
  • 是的@Tim,我正在使用 Swift,我在想解决方案是解决这个难题,然后使用 numberOfMatches(in:options:range:) 来计算出现次数
  • 谢谢@Toto 我不知道为什么我在搜索中没有找到这个答案。这看起来是正确的想法。

标签: regex


【解决方案1】:

如果您选择的编程语言或工具的正则表达式引擎支持正向预测?
然后你可以使用它。

在示例字符串中计数 13 个“aaa”的 javascript 示例:

var str = "aaaaaaaaaaaaaaa";
var re = /(?=(aaa))/g;

var total = str.match(re).length;
console.log(total);

另一个例子,计数为 3 "abcabc":

var str = "abcabcabcabc";
var searchString = "abcabc";
var re = new RegExp("(?=("+searchString+"))", "g");

var total = str.match(re).length;
console.log(total);

【讨论】:

    【解决方案2】:

    通常我会选择像(aaa)+这样的量词,或者如果你知道具体的长度然后(aaa){5}或者如果你需要它至少5次然后(aaa){5,}或最多5个(aaa){,5}或最少5 个,最多 10 个这样的(aaa){5,10}

    如果您不确定是否有任何匹配项,那么您也可以选择“0 或更多”,即 (aaa)*

    作为提示,您可以像这样(糟糕地)匹配 IPv4 地址:

    ([0-9]{1,3}\.?){4}
    

    不要在生产中使用它来匹配 IP,这只是为了说明重复模式:)

    【讨论】:

    • 你在回答什么问题?
    • 编辑前的问题。
    • 但是,我没有看到对这个问题的任何编辑???
    • 它说“昨天编辑”,大约是在我发布这篇文章之后的几个小时和你开始对我感到困惑的两个小时之前:)
    • 仅供参考:问题2019-10-27 13:02:37Z 稍后没有任何更新,您的答案2016-10-27 13:08:21Z
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-24
    • 1970-01-01
    相关资源
    最近更新 更多