我的示例数据:
l1
[1] "xmms-1.2.11-x86_64-5" "xmms-1.2.11-x86_64-6"
[3] "xmodmap-1.0.10-x86_64-1" "xmodmap-1.0.9-x86_64-1"
[5] "xmodmap3-1.0.10-x86_64-1" "xmodmap3-1.0.9-x86_64-1"
我正在使用 R,并且想要一个正则表达式,该表达式将仅捕获第一个破折号之前的字符。如
xmms
xmms
xmodmap
xmodmap
xmodmap3
xmodmap3
由于我使用的是R,因此正则表达式需要符合Perl。
我以为我可以通过在破折号上使用回溯来做到这一点,但我只是得到了整个字符串的匹配。这是我尝试过的模式:grepl("(?<=[a-z0-9])-",l1, perl=T)
,但它只是匹配整个字符串。我想如果我将第一个破折号作为捕获组,我也许可以使用后视,但我不知道如何使用后视和捕获组构建正则表达式。
我环顾其他一些问题寻找可能的答案,似乎我需要一个不贪婪的符号?我尝试了grepl("(?<=[a-z0-9])-/.+?(?=-)/",l1, perl=T)
,但也没有用。
我愿意接受有关如何在破折号之前捕获第一组字符的其他建议。我目前在基本 R 中,但我可以使用任何包,例如纵梁。
您也可以提取直到第一次出现"-"
。使用基本 Rsub
sub("(.*?)-.*", "\1", l)
#[1] "xmms" "xmms" "xmodmap" "xmodmap" "xmodmap3" "xmodmap3"
或带stringr::str_extract
stringr::str_extract(l, "(.*?)(?=-)")
数据
l <- c("xmms-1.2.11-x86_64-5","xmms-1.2.11-x86_64-6","xmodmap-1.0.10-x86_64-1",
"xmodmap-1.0.9-x86_64-1","xmodmap3-1.0.10-x86_64-1" ,"xmodmap3-1.0.9-x86_64-1")
> 1( 基数 R一个选项是从base R
sub
以匹配后跟字符 (.*
-
,然后替换为空白 (""
(
sub("-.*", "", l1)
#[1] "xmms" "xmms" "xmodmap" "xmodmap" "xmodmap3" "xmodmap3"
或成组捕获
sub("(\w+).*", "\1", l1)
#[1] "xmms" "xmms" "xmodmap" "xmodmap" "xmodmap3" "xmodmap3"
或者用regmatches/regexpr
regmatches(l1, regexpr('\w+', l1))
#[1] "xmms" "xmms" "xmodmap" "xmodmap" "xmodmap3" "xmodmap3"
或使用trimws
trimws(l1, "right", whitespace = "-.*")
#[1] "xmms" "xmms" "xmodmap" "xmodmap" "xmodmap3" "xmodmap3"
或使用read.table
read.table(text = l1, sep="-", header = FALSE, stringsAsFactors = FALSE)$V1
#[1] "xmms" "xmms" "xmodmap" "xmodmap" "xmodmap3" "xmodmap3"
或与strsplit
sapply(strsplit(l1, "-"), `[`, 1)
<小时 />2(纵梁或stringr
word
library(stringr)
word(l1, 1, sep="-")
或与str_remove
str_remove(l1, "-.*")
#[1] "xmms" "xmms" "xmodmap" "xmodmap" "xmodmap3" "xmodmap3"
3( stringi或与stringi
的stri_extract_first
library(stringi)
stri_extract_first(l1, regex = "\w+")
#[1] "xmms" "xmms" "xmodmap" "xmodmap" "xmodmap3" "xmodmap3"
注意:grep/grepl
用于检测字符串中的模式。 要替换/提取子字符串,请在base R
中使用sub/regexpr/regmatches
数据
l1 <- c("xmms-1.2.11-x86_64-5", "xmms-1.2.11-x86_64-6", "xmodmap-1.0.10-x86_64-1",
"xmodmap-1.0.9-x86_64-1", "xmodmap3-1.0.10-x86_64-1", "xmodmap3-1.0.9-x86_64-1"
)
我想与你所追求的匹配的最简单的正则表达式是
^[^-]+
匹配字符串 (^
( 和至少一个不是-
字符 ([^-]
( 的开头 (+
(。
在 regex101 上看到它。
如果需要捕获它,请添加周围的括号。
^([^-]+)