我想提取部分字符串。字符串是:
> (x <- 'ab/cd efgh "xyz xyz"')
> [1] "ab/cd efgh \"xyz xyz\""
现在,我想先提取第一部分:
> # get "ab/cd efgh"
> sub(" \"[/A-Za-z ]+\"","",x)
[1] "ab/cd efgh"
但我没有成功地提取第二部分:
> # get "xyz xyz"
> sub("(\"[A-Za-z ]+\")$","\\1",x, perl=TRUE)
[1] "ab/cd efgh \"xyz xyz\""
此代码有什么问题?
谢谢你的帮助。
答案 0 :(得分:1)
您的上一个代码段不起作用,因为您将整个匹配重新插入到结果中:(\"[A-Za-z ]+\")$
匹配并捕获"
,1 +个字母和空格,"
进入第1组和{替换中的{1}}将其放回原位。
您实际上可以通过删除字符串开头的\1
以外的所有字符来获取引号内的最后一部分:
"
请参阅R demo
x <- 'ab/cd efgh "xyz xyz"'
sub('^[^"]+', "", x)
此处只会找到并替换一次,它会匹配字符串开头(sub
),后跟^
以外的1 +字符"
否定了角色等级。
答案 1 :(得分:1)
要使其与sub
一起使用,您必须匹配整个字符串。帮助文件说
对于sub和gsub,返回一个长度相同且属性与x相同的字符向量(在可能强制转换为字符之后)。未替换的字符向量x的元素将保持不变(包括任何声明的编码)。
所以为了让这个与你的正则表达式一起工作,预先安排有时候有风险的捕获“。*”
sub(".*(\"[A-Za-z ]+\")$","\\1",x, perl=TRUE)
[1] "\"xyz xyz\""