2016-07-14 33 views
3
s <- "1-343-43Hello_2_323.14_fdh-99H" 

在R中我想用一個正則表達式來獲取子字符串,比如說第二個下劃線。這怎麼能用一個正則表達式來完成?另一種方法是用'_'分割,然後粘貼前兩個 - 一些東西;R,第n次出現之前的所有內容的正則表達式

paste(sapply(strsplit(s, "_"),"[", 1:2), collapse = "_") 

給出:

[1] "1-343-43Hello_2" 

但我怎麼可以讓一個正則表達式表達做?

回答

4

您可以使用sub

sub("^([^_]*_[^_]*).*", "\\1", s) 

regex demo

R code demo

s <- "1-343-43Hello_2_323.14_fdh-99H" 
sub("^([^_]*_[^_]*).*", "\\1", s) 
## => [1] "1-343-43Hello_2" 

圖案的詳細資料

  • ^ - 字符串的開始
  • ([^_]*_[^_]*) - 比_其他組1捕獲0+字符,然後_,再0+非_小號
  • .* - 字符串的其餘部分(注意:TRE正則表達式匹配.換行符)。

\\1更換隻返回內部集團1.

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(/^[^_]*_[^_]*/); 
+0

問題是明確約R. – horcrux

+0

對不起,我沒有聽清楚 –

6

一般情況下,回答這個問題的稱號,是

sub("^(([^_]*_){n}[^_]*).*", "\\1", s) 

其中n是您允許的_數量。

+0

其實'N'是下劃線的1,所以如果你想允許然後2突出,n爲1 –

+0

@ G.Grothendieck數減不,它不是。 – horcrux

+0

你是對的,但是這個問題指的是「在第二個下劃線之前的子字符串」,對於那個n = 1而不是2,這就是我試圖澄清的東西,但卻明顯地使它變得模糊。無論如何,我確實給你提供了最普遍的答案。 –

0
sub('\\_\\d+\\..*$','',s) 
#[1] "1-343-43Hello_2" 
相關問題