正则表达式保留一些匹配,删除其他匹配

时间:2014-06-25 04:25:09

标签: regex r

我在使用这个正则表达式时遇到了麻烦。考虑以下向量。

> 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,但删除包含:的其他正则表达式?

2 个答案:

答案 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以及后面的任何字符
  • $锚点断言我们位于字符串的末尾