Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.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_String - Fatal编程技术网

从R中特殊字符之间的字符串中删除子字符串

从R中特殊字符之间的字符串中删除子字符串,r,regex,string,R,Regex,String,我在寻找答案,但失败了。我的问题有点奇怪,我还在学习正则表达式。我想从中实现: str1 <- 'txt1/txt2/123|abc_def_123|1991-02-11' 因此,从/包括到第一次出现|的所有内容都应该删除。 到目前为止,我写了一篇: sub("\\/.*\\|", "|", str1 ) 但它把所有的东西都移到了最后一次| 我怎样才能指出子字符串应该被删除到第一次出现|?在您尝试之后,您可以使您的正则表达式变懒 sub("/.*?\\|", "|", str1 ) #

我在寻找答案,但失败了。我的问题有点奇怪,我还在学习正则表达式。我想从中实现:

str1 <- 'txt1/txt2/123|abc_def_123|1991-02-11'
因此,从/包括到第一次出现|的所有内容都应该删除。 到目前为止,我写了一篇:

sub("\\/.*\\|", "|", str1 )
但它把所有的东西都移到了最后一次|


我怎样才能指出子字符串应该被删除到第一次出现|?

在您尝试之后,您可以使您的正则表达式变懒

sub("/.*?\\|", "|", str1 )
#[1] "txt1|abc_def_123|1991-02-11"

可以使用具有正向前瞻的否定字符类

/[^|]*(?=\|)
要不跨越换行符,可以扩展否定字符类:

/[^|\r\n]*(?=\|)

另一种方法是使用反向引用:

sub("(^.*)/.*/.*?(\\|.*$)", "\\1\\2", str1)
[1] "txt1|abc_def_123|1991-02-11"
这里,双回溯引用\\1\\2“调用”两个捕获组中的字符串…,而不包括在捕获组中的部分将被删除。

您可以使用/[^ |]*它接受第一个/和之后的所有内容,只要它不是一个|

/[^|\r\n]*(?=\|)
str1 <- 'txt1/txt2/123|abc_def_123|1991-02-11'
sub("/[^|]*(?=\\|)", "", str1, perl=TRUE)
[1] "txt1|abc_def_123|1991-02-11"
sub("(^.*)/.*/.*?(\\|.*$)", "\\1\\2", str1)
[1] "txt1|abc_def_123|1991-02-11"
sub("/[^|]*", "", str1)
#[1] "txt1|abc_def_123|1991-02-11"