簡體   English   中英

正則表達式保留一些匹配,刪除其他匹配

[英]Regular expression to keep some matches, remove others

我在使用這個正則表達式時遇到了麻煩。 考慮以下向量。

> 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但刪除其他包含:

使用| (請選擇一個包含: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"

你可以使用這個簡單的正則表達式:

^[^:]+(?::main.*)?$

演示

不確定確切的R代碼,但是類似的東西

grepl("^[^:]+(?::main.*)?$", subject, perl=TRUE);

說明

  • ^ anchor斷言我們位於字符串的開頭
  • [^:]+匹配所有不是冒號的字符
  • 可選的非捕獲組(?::main.*)? 匹配冒號, main和后面的任何字符
  • $ anchor斷言我們在字符串的末尾

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM