我们可以使用`gsub`以正则表达式的方式捕获子字符串(由连续重复的字符分组)并将其替换为相反的子字符串吗?

问题描述 投票:0回答:1

我正在尝试探索正则表达式捕获由连续重复的字符分组的子字符串并将其替换为其相反的能力,但是仅使用

gsub

例如,给定一个字符串

s <- "abxxxyyyyzzpqr"
,其中
"xxxyyyyzz"
应该被捕获并依次替换为
"zzyyyyxxx"
。我想我们可能需要两个步骤:

  1. “捕捉”:如何设计捕捉
    "xxxyyyyzz"
    的图案(
    "x"
    "y"
    "z"
    不断重复)
  2. “反转”:如何将
    xxxyyyyzz
    反转,最终得到一个新的字符串
    "abzzyyyyxxxpqr"

由于我对正则表达式的了解有限,我不确定

gsub
是否可以独自完成这项任务。如果可能的话,我们将不胜感激地了解如何实施它。


更多示例

我正在寻找通用正则表达式,而不是特定字符:

  • "xxabcyyyzzpqr"
    ->
    "xxabczzyyypqr"
    ,其中
    "yyyzz"
    应该是目标
  • "xaaab,,,@@@&&"
    ->
    "xaaab&&@@@,,,"
    ,其中
    ",,,@@@&&"
    应该是目标
  • "xxaaab,,,@@@&&"
    ->
    "aaaxxb&&@@@,,,"
    ,其中
    "xxaaa"
    ",,,@@@&&"
    都应该是目标
r regex string replace gsub
1个回答
1
投票

配套部分

...很微不足道:

(         # Match a sequence consisting of
  (.)     # a letter
  \2+     # followed by 1 or more instances of that same letter
){2,}     # 2 or more times.

在 regex101.com 上尝试一下

换向部分

...没那么多。

根据

本页,替换字符串中允许的唯一特殊标记是反向引用、\L

l小写转换)、\U
u大写转换)和\E
end)大小写转换)。这意味着我们甚至无法访问 PCRE 条件替换(例如 ${1:+foo:bar}
)。

由于替换字符串没有任何帮助,我们需要仅使用模式本身来捕获组中的反转字符串。然而,据我所知,从字符串 Y 捕获字符串 X(到单个组中),其中 X 不是 Y 的子字符串是不可能的。捕获多个组也不是一种选择,因为我们不知道需要多少个组。

也就是说,仅使用

gsub()

 来反转字符串是不可能的。

© www.soinside.com 2019 - 2024. All rights reserved.