量词可以用于R中的正则表达式替换吗?

量词可以用于R中的正则表达式替换吗?,r,regex,pcre,character-replacement,R,Regex,Pcre,Character Replacement,我的目标是用一个符号替换一个字符串,该符号重复的字符数与字符串的字符数相同,就像人们可以用\\U\\1将字母替换为大写字母一样,如果我的模式是“…*”(*)“我对(*)捕获的内容的替换类似于x\\q1或{\\q1}x所以我会得到很多x作为*捕获的字符 这可能吗 我主要是在sub,gsub中思考,但是你可以用其他库来回答,比如stringi,stringr,等等。 您可以方便地使用perl=TRUE或perl=FALSE和任何其他选项 我认为答案可能是否定的,因为选项似乎非常有限(?gsub):

我的目标是用一个符号替换一个字符串,该符号重复的字符数与字符串的字符数相同,就像人们可以用
\\U\\1
将字母替换为大写字母一样,如果我的模式是
“…*”(*)“
我对
(*)
捕获的内容的替换类似于
x\\q1
{\\q1}x
所以我会得到很多
x
作为
*
捕获的字符

这可能吗

我主要是在
sub,gsub
中思考,但是你可以用其他库来回答,比如
stringi,stringr
,等等。 您可以方便地使用
perl=TRUE
perl=FALSE
和任何其他选项

我认为答案可能是否定的,因为选项似乎非常有限(
?gsub
):

sub和gsub中匹配模式的替换。如果可能的话,被强迫扮演角色。对于fixed=FALSE,这可能包括对模式的括号子表达式的反引用“\1”到“\9”。仅对于perl=TRUE,它还可以包含“\U”或“\L”以将替换的其余部分转换为大写或小写,以及“\E”转换为小写。如果提供长度为2或更多的字符向量,则第一个元素将与警告一起使用。如果为NA,则结果中与匹配项对应的所有元素都将设置为NA。
主要量词是(
?base::regex
):

?
前面的项目是可选的,最多匹配一次。
*
前一项将匹配零次或多次。
+
前一项将匹配一次或多次。
{n}
前一项正好匹配n次。
{n,}
前一项匹配n次或多次。
{n,m}
前一项至少匹配n次,但不超过m次。
好的,但它似乎是一个选项(它不在
PCRE
中,不确定是在
PERL
中还是在哪里…
(*)
,它捕获了星号量词能够匹配的字符数(我在那里找到它),因此可以使用它来引用第一个捕获的量词(还有
\q2
,等等)。我还读到
(*)
相当于
{0,}
,但我不确定这是否真的是我感兴趣的事实

编辑更新


由于有评论者提问,我用作者提供的一个具体示例更新了我的问题。我对示例进行了一些修改。假设我们有
a量词不能在替换模式中使用,也不能提供它们匹配多少字符的信息

您需要的是查找字符串中特定位置后的连续匹配项:

a
请参阅和

详细信息

  • (?:\G(?)|)(?-上一次成功匹配的结束或五个非空白字符前面没有非空白字符
  • \K
    -到目前为止匹配的丢弃文本
  • \S
    -任何非空白字符

gsubfn
gsub
类似,不同之处在于替换字符串可以是一个输入匹配项并输出替换项的函数。该函数可以选择性地表示为一个公式,就像我们在这里所做的那样,用替换该字符串的函数的输出替换每个单词字符字符串。没有复杂的正则表达式我们需要

library(gsubfn)

gsubfn("\\w+", ~ paste0(substr(x, 1, 5), strrep(".", max(0, nchar(x) - 5))), a)
## [1] "I hate extra space. eleph..."
或几乎相同,只是功能略有不同:

gsubfn("\\w+", ~ paste0(substr(x, 1, 5), substring(gsub(".", ".", x), 6)), a)
## [1] "I hate extra space. eleph..."

请显示一个具体的问题,包括输入和预期的输出。您可以使用
regexpr
来确定匹配位置和长度,然后使用
子项。您发布的是XY问题。必须有其他方法来解决这个问题,顺便问一句,
\\L\\1
将使用小写字母,而不是大写字母第1组值。我想您是在询问类似于
gsub((?:\\G(?!^)\\\()\\K[^()](?=[^()]*\\)”,“x”,“888)45 78 44”,perl=TRUE)的问题
,请看,如果您编辑了您的问题,您的问题会更好。我感谢您对此进行了研究,但在回答问题时引用帮助页通常比引用问题更合适。可能只需说“我”我在
?base::regex
上读过有关量词的内容,但没有找到任何关于在替换中使用量词的内容。@G.Grothendieck我用具体问题编辑了我的问题