gpt4 book ai didi

regex - 用重复的单个字符替换捕获组,同时保留捕获组的长度

转载 作者:行者123 更新时间:2023-12-01 00:52:31 24 4
gpt4 key购买 nike

假设您要替换 AXAAAA ,还有AXXXXXAAAAAAAA .

基本上任意数量的 X两个字符之间的字符 A s 与适当的数量 A s。

使用 gsub()我试过:

gsub(x = "AXA", pattern = "(A)(X+)(\\1)", replacement = "\\1\\1\\1")

这给 AAA .然而,它是 AAA不管多久 X+得到。如何在输出中访问子组 2 的长度?

可能与此重复:
Replace repeating character with another repeated character

但恕我直言,对于一个单独的问题来说完全不同。

最佳答案

你有一个固定的替换模式:你捕获 A在第一组中,所以,\\1A .因此,您将获得 3 个 As。您需要一种不同的方法:替换所有连续的 X之前 A之后 A . Perl 风格的正则表达式是可能的:

input = "AXXXA"
gsub("(?:A|(?<!^)\\G)\\KX(?=X*A)", "A", input, perl=TRUE)

demo code 的输出:
[1] "AAAAA"
\G强制连续匹配,和 \K帮助我们切断最初匹配的 A . (?=X*A)前瞻确保我们有任意数量的 X之前 A .

编辑:

这种方法也适用于更长的字符串( here ,我们将 Xyz 之间的每个 123 替换为 A ):
input = "123XyzXyzXyz123"
gsub("(?:123|(?<!^)\\G)\\KXyz(?=(?:Xyz)*123)", "A", input, perl=TRUE)

输出: [1] "123AAA123"
编辑2:

替换 2 A 之间的任何字母我们可以使用 \p{L}匹配任何字母之前的速记字符类 A :
gsub("(?:A|(?<!^)\\G)\\K\\p{L}(?=\\p{L}*A)", "A", input, perl=TRUE)
=> [1] "XSDFAAAAAA"

关于regex - 用重复的单个字符替换捕获组,同时保留捕获组的长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30253855/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com