s <- "1-343-43Hello_2_323.14_fdh-99H"
在R中我想使用正则表达式来获取子串,比如说第二个下划线。如何使用一个正则表达式完成这项工作?另一种方法是用'_'分割,然后粘贴前两个 - 一些东西;
paste(sapply(strsplit(s, "_"),"[", 1:2), collapse = "_")
给予:
[1] "1-343-43Hello_2"
但是我如何制作正则表达式来做同样的事情呢?
答案 0 :(得分:6)
一般来说,回答标题中的问题是
sub("^(([^_]*_){n}[^_]*).*", "\\1", s)
其中n
是您允许的_
的数量。
答案 1 :(得分:4)
您可以使用sub
:
sub("^([^_]*_[^_]*).*", "\\1", s)
请参阅regex demo
s <- "1-343-43Hello_2_323.14_fdh-99H"
sub("^([^_]*_[^_]*).*", "\\1", s)
## => [1] "1-343-43Hello_2"
模式详情:
^
- 字符串开头([^_]*_[^_]*)
- 第1组捕获除_
以外的0 +个字符,然后是_
,再次是0 +非_
s .*
- 字符串的其余部分(请注意TRE正则表达式.
也匹配换行符。) \\1
替换只返回组1内的值。
答案 2 :(得分:0)
echo preg_replace("/([^_])_([^_]).*/" , "$1_$2" , "1-343-43Hello_2_323.14_fdh-99H");
或者如果你正在寻找匹配的int / ^ [^ ] * [^ _] * /将是匹配它的正则表达式字符串
<?php
echo preg_match("/^[^_]*_[^_]*/" , "1-343-43Hello_2_323.14_fdh-99H" , $test );
var_dump( $test );
?>
或在javascript中
"1-343-43Hello_2_323.14_fdh-99H".match(/^[^_]*_[^_]*/);
答案 3 :(得分:0)
sub('\\_\\d+\\..*$','',s)
#[1] "1-343-43Hello_2"
答案 4 :(得分:0)
这里是 gsub(在 data.table 中),以防您需要 perl=TRUE,(fx 前瞻和后视),不幸的是,它在 str_match 中不起作用
dtx[, var_stringr := stringr::str_match(string, '([^_]+)(?:_[^_]+){5}$')[,2]][]
dtx[
# first select the ones with '_' so that the third element is NA
grepl('_', string),
var_gsub := sub('(.*_)([^_]+)(_[^_]+){5}$', '\\2', string)][]
这种方法的缺点是,如果你选择一个比第 n 次出现次数多的数字,而不是像 str_match 那样返回 NA,它会返回整个字符串。