我在使用这个正则表达式时遇到了麻烦。考虑以下向量。
> vec <- c("new jersey", "south dakota", "virginia:chincoteague",
"washington:whidbey island", "new york:main")
在包含:
的字符串中,我希望仅在main
后保留:
的字符串,从而产生
[1] "new jersey" "south dakota" "new york:main"
到目前为止,我只能用这种丑陋的嵌套噩梦到达那里,这显然远非最佳。
> g1 <- grep(":", vec)
> vec[ -g1[grep("main", grep(":", vec, value = TRUE), invert = TRUE)] ]
# [1] "new jersey" "south dakota" "new york:main"
如何编写单个正则表达式以保留:main
,但删除包含:
的其他正则表达式?
答案 0 :(得分:6)
使用|
(选择一个包含:main
或完全不包含:
的内容):
> vec <- c("new jersey", "south dakota", "virginia:chincoteague",
+ "washington:whidbey island", "new york:main")
> grep(":main|^[^:]*$", vec)
[1] 1 2 5
> vec[grep(":main|^[^:]*$", vec)]
[1] "new jersey" "south dakota" "new york:main"
答案 1 :(得分:3)
您可以使用这个简单的正则表达式:
^[^:]+(?::main.*)?$
请参阅demo
不确定确切的R代码,但类似
grepl("^[^:]+(?::main.*)?$", subject, perl=TRUE);
<强>解释强>
^
锚点断言我们位于字符串的开头[^:]+
匹配所有不是冒号的字符(?::main.*)?
匹配冒号,main
以及后面的任何字符$
锚点断言我们位于字符串的末尾