当前位置: 首页 > 知识库问答 >
问题:

如何确定正则表达式中的重复次数?

葛阳华
2023-03-14

假设我想使用正则表达式将字符串1的任意重复次数替换为字符串2的相同重复次数。例如,字符串1=“苹果”,字符串2=“橙色”。

我想象这样的情况:

s/apple{2,}/orange{N}/

但是我不知道如何指定N来匹配苹果的重复次数。这可能吗?

注意:正如xhienne所指出的,我正在寻找重复,因此字符串1至少出现两次。

样本输入:

Lorem的ipsum dolor坐在那里,奉献给我们,做eiusmod的诱惑偶然或劳动和多洛雷巨型等。苹果Ut enim广告minim veniam,quis nostrud锻炼ullamco劳动是nisi ut aliquip前ea commodo随之而来。苹果例外的情况下,不显露,苹果在错误的地方是不必要的。

样本输出:

Lorem的ipsum dolor坐在那里,奉献给我们,做eiusmod的诱惑偶然或劳动和多洛雷巨型等。苹果Ut enim广告minim veniam,quis nostrud锻炼ullamco劳动是nisi ut aliquip前ea commodo随之而来。在谴责中的不真实的多洛尔在VELIT ESSE CILLIA多洛雷欧盟逃犯nulla pariatur。

共有2个答案

祁永嘉
2023-03-14

由于此问题最初是在您使用vim时出现的(vim不支持Wiktor Stribiżew在其回答中使用的\G运算符),下面是一个专门针对vim的回答:

:s/\(apple\)\{2,\}/\= substitute(submatch(0), "apple", "orange", "g")/g

(当然,这不能被认为是真正的正则表达式,因为它使用vim函数在匹配的文本中进行子替换)

姚星河
2023-03-14

一个可能的解决方案是使用支持\G运算符的正则表达式

(?:\G(?!\A)|(?=(?:apple){2}))apple

查看正则表达式演示

细节

  • (?:\G(?!\A)|(?=(?:apple){2}))-匹配以下两个备选方案之一的非捕获组:
    • \G(?!\A)-上一次成功匹配的结束(从\G中减去字符串位置的开始)
    • |-或
    • (?=(?:apple){2})-字符串中的一个位置,后跟两个出现的apple子字符串

    请注意,正则表达式不需要计算太多,它只是找到一个字符串重复2次的地方,然后,它替换所有连续的相邻匹配。

 类似资料:
  • 问题内容: 我想知道是否有更好的方法来表示正则表达式中的固定重复次数。例如,如果我只想精确匹配14个字母/数字,那么我将使用哪个将匹配类似和不匹配的单词 ?在目前正在用Java执行的操作中,但我想这可能也适用于其他语言。提前致谢。 问题答案: 对于Java: 量词文档 X,恰好n次:X {n} X,至少n次:X {n,} X,至少n次但不超过m次:X {n,m}

  • 如何在不包含连续子字符串baa的字母表{a,b,c}上表达正则表达式?

  • 谁能提供提取第2个和第3个之间的数据的正则表达式吗 例如,对于下面的数据 2016年度1.1-12.31 COH(NP)#21485 结果应为COH(NP)

  • 我的Java程序中有这个正则表达式 我也想在正则表达式中包含[和]。我也尝试使用转义字符,但没有成功。如何将这些字符添加到我的正则表达式中? 使用此示例 我试过\[和[,它不工作 上一次运行上述代码时,输出<code>Test:false

  • 我不知道如何表达这个问题的标题,但想象一下我有以下字符串: 我想要一个正则表达式,它允许我获得和 我目前拥有的正则表达式是。 这个正则表达式的问题是,它得到了和。这是因为它与的括号匹配。但我需要一个正则表达式,它忽略4的括号,只匹配外部的,如果这有意义的话。 编辑:为了更深入地了解这个问题,这正是我所期望的字符串类型: