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

Rでは、2番目の例ではアンダースコアの前に部分文字列を取得したいと考えています。どのようにこれは1つの正規表現で行うことができますか?代わりに、 '_'で分割して最初の2つのものを貼り付けることもできます。R、n番目のオカレンスの前のすべての正規表現

[1] "1-343-43Hello_2" 

をしかし、どのように、私は同じことを行うための正規表現の式を行うことができます。

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

を与えますか?

答えて

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

、タイトルに質問に答えるために、nは、あなたが許可されている_の数である

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

です。

+0

が実際に 'N'は、あなたが2許可したい場合は、その後アンダーN G.Grothendieck @ 1 –

+0

あるので、アンダースコアの数マイナス1というキャッチいませんでしいいえ、そうではありません。 – horcrux

+0

あなたは正しいですが、質問は「2番目のアンダースコアの前の部分文字列」と2番目のn = 1の部分文字列を指していますが、それは明確にしようとしていましたが明確に間違っていました。私はあなたに最も一般的な答えを提供するためにどんな場合でもupvoteを与えました。 –

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