Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R-替换正则表达式匹配的最后一个实例以及之后的所有内容_R_Regex - Fatal编程技术网

R-替换正则表达式匹配的最后一个实例以及之后的所有内容

R-替换正则表达式匹配的最后一个实例以及之后的所有内容,r,regex,R,Regex,我尝试使用正则表达式替换短语的最后一个实例(以及该短语之后的所有内容,可以是任何字符): 但是,我似乎无法使refex正常工作: Input: "_AB:C-_ABCDEF_ABC:45_ABC:454:" Actual output: "_AB:C-CBA" Desired output: "_AB:C-_ABCDEF_ABC:45_CBA" 我也尝试过gsub(),但没有成功 知道我哪里出错了吗?使用gsub和反向引用 gsub("(.*)ABC.*$", "\\1CBA","_AB:C-

我尝试使用正则表达式替换短语的最后一个实例(以及该短语之后的所有内容,可以是任何字符):

但是,我似乎无法使refex正常工作:

Input: "_AB:C-_ABCDEF_ABC:45_ABC:454:"
Actual output: "_AB:C-CBA"
Desired output: "_AB:C-_ABCDEF_ABC:45_CBA"
我也尝试过gsub(),但没有成功


知道我哪里出错了吗?

使用
gsub
和反向引用

gsub("(.*)ABC.*$", "\\1CBA","_AB:C-_ABCDEF_ABC:45_ABC:454:")
[1] "_AB:C-_ABCDEF_ABC:45_CBA"

使用
gsub
和反向引用

gsub("(.*)ABC.*$", "\\1CBA","_AB:C-_ABCDEF_ABC:45_ABC:454:")
[1] "_AB:C-_ABCDEF_ABC:45_CBA"
一种解决办法是:

sub("(.*)_ABC.*", "\\1_CBA", Input)
[1] "_AB:C-_ABCDEF_ABC:45_CBA"
一种解决办法是:

sub("(.*)_ABC.*", "\\1_CBA", Input)
[1] "_AB:C-_ABCDEF_ABC:45_CBA"

可以说,最安全的做法是使用负面前瞻来查找最后一次事件:

_ABC(?:(?!_ABC).)+$


可以说,最安全的做法是使用负面前瞻来查找最后一次事件:

_ABC(?:(?!_ABC).)+$

看看什么是:

用给定的替换字符串替换与正则表达式匹配的输入的最后一个子字符串

您的
\u ABC.$
模式在
\u AB:C-\u ABCDEF\u ABC:45\u ABC:454:
中与什么匹配?它匹配第一个
\u ABC
(即紧跟在
C-
之后)和行尾之后的所有文本(
*$
在行尾抓取0多个字符,而不是换行字符)。因此,您只有1个匹配项,这是最后一个匹配项

解决方案可以有很多:

1) 捕获模式最后一次出现之前的所有文本,并使用替换的反向引用插入捕获的值(此模式不必用
$
锚定在字符串的末尾):

2) 使用确保在匹配后只匹配没有启动模式到字符串末尾的任何字符(此模式必须用
$
锚定在字符串末尾):

请注意,此模式需要使用带有
sub
的PCRE引擎解析
perl=TRUE
参数(或者您可以使用ICU正则表达式库供电并支持lookaheads的
stringr::str_replace

3) 可以使用负前瞻来确保模式不会出现在模式右侧的任何位置(此模式不必用
$
锚定在字符串的末尾):

请参阅,所有这三行代码都返回
\u AB:C-\u ABCDEF\u ABC:45\u CBA

请注意,如果字符串可能包含换行符,则PCRE模式中的
(?s)
是必需的(并且PCRE模式中的
默认情况下与换行符不匹配)。

请查看以下内容:

用给定的替换字符串替换与正则表达式匹配的输入的最后一个子字符串

您的
\u ABC.$
模式在
\u AB:C-\u ABCDEF\u ABC:45\u ABC:454:
中与什么匹配?它匹配第一个
\u ABC
(即紧跟在
C-
之后)和行尾之后的所有文本(
*$
在行尾抓取0多个字符,而不是换行字符)。因此,您只有1个匹配项,这是最后一个匹配项

解决方案可以有很多:

1) 捕获模式最后一次出现之前的所有文本,并使用替换的反向引用插入捕获的值(此模式不必用
$
锚定在字符串的末尾):

2) 使用确保在匹配后只匹配没有启动模式到字符串末尾的任何字符(此模式必须用
$
锚定在字符串末尾):

请注意,此模式需要使用带有
sub
的PCRE引擎解析
perl=TRUE
参数(或者您可以使用ICU正则表达式库供电并支持lookaheads的
stringr::str_replace

3) 可以使用负前瞻来确保模式不会出现在模式右侧的任何位置(此模式不必用
$
锚定在字符串的末尾):

请参阅,所有这三行代码都返回
\u AB:C-\u ABCDEF\u ABC:45\u CBA


请注意,如果字符串可能包含换行符,则PCRE模式中的
(?s)
(并且PCRE模式中的
默认情况下与换行符不匹配)。

*
设置为非贪婪,这样应该可以工作<代码>\u ABC.*?$你能再举些例子吗?西蒙,我推荐。我解释了您的方法不起作用的原因,并通过演示添加了可能的解决方案。使
*
非贪婪,它应该会起作用<代码>\u ABC.*?$你能再举些例子吗?西蒙,我推荐。我解释了您的方法不起作用的原因,并通过演示添加了可能的解决方案。您的
(?:(?!\u ABC))+
是。@WiktorStribiżew谢谢!我将确定以后将
放置在何处。您的
(?:(?!\u ABC))+
标记是。@WiktorStribiżew谢谢!我将确定将来将
放置在何处。
sub("(?s)_ABC(?:(?!_ABC).)*$", "_CBA","_AB:C-_ABCDEF_ABC:45_ABC:454:", perl=TRUE)
sub("(?s)_ABC(?!.*_ABC).*", "_CBA","_AB:C-_ABCDEF_ABC:45_ABC:454:", perl=TRUE)