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

Tho*_*ing 2 regex string replace r gsub

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

例如,给定一个字符串s <- "abxxxyyyyzzpqr""xxxyyyyzz"应捕获 where 并依次替换为"zzyyyyxxx"。我想我们可能需要两个步骤:

  1. “捕获”:如何设计捕获的模式"xxxyyyyzz""x""y""z"不断重复)?
  2. “reverse”:如何进行xxxyyyyzz反转以便我们最终获得一个新字符串"abzzyyyyxxxpqr"

由于我对正则表达式的了解有限,我不确定是否可以独自gsub完成这项任务。如果可能的话,我们将不胜感激地了解如何实施它。


更多示例

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

  • "xxabcyyyzzpqr"-> "xxabczzyyypqr""yyyzz"目标应该在哪里
  • "xaaab,,,@@@&&"-> "xaaab&&@@@,,,"",,,@@@&&"目标应该在哪里
  • "xxaaab,,,@@@&&"-> "aaaxxb&&@@@,,,",其中"xxaaa"和 都",,,@@@&&"应该是目标

G. *_*eck 9

不确定单个正则表达式gsub; 然而,这一行的使用gsubfn就可以了。 gsubfn类似,gsub只是替换参数可以是一个接受匹配和捕获组的函数,用函数的输出替换匹配。 backref=0表示将整个匹配项输入到函数中,但不输入捕获组。第二个参数中给出的函数在此处使用公式符号指定。我们可以交替使用stringi::stri_reverse作为第二个参数。

library(gsubfn)

s <- c("xxabcyyyzzpqr", "xaaab,,,@@@&&", "xxaaab,,,@@@&&")

gsubfn("(((.)\\3+)+)", ~ intToUtf8(rev(utf8ToInt(x))), s, backref = 0)
## [1] "xxabczzyyypqr"  "xaaab&&@@@,,,"  "aaaxxb&&@@@,,,"
Run Code Online (Sandbox Code Playgroud)

它也可以写成以下形式,其中&表示整个匹配。在这种情况下,我们可以省略该backref=参数。

gsubfn("(((.)\\3+)+)", ~ intToUtf8(rev(utf8ToInt(`&`))), s)
## [1] "xxabczzyyypqr"  "xaaab&&@@@,,,"  "aaaxxb&&@@@,,,"
Run Code Online (Sandbox Code Playgroud)


InS*_*ync 5

配套部分

...很简单:

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

在 regex101.com 上尝试一下。

换向部分

...没那么多。

根据此页面,替换字符串中允许的唯一特殊标记是反向引用、\L小写转换)、\U大写转换)和\E大写转换)。这意味着我们甚至无法访问 PCRE 条件替换(例如${1:+foo:bar})。

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

也就是说,不使用任何其他方法来反转子字符串gsub()是不可能的。