2016-09-06 19 views
1

期待される出力を持つ次の文字列を検討してください。次の文字列に2番目のオカレンスを抽出する

"NE-390-SM-04"     --> "390-SM-04" 
"90055-SL-01-J"    --> "90055-SL-01" 
"NE-1478-SL-02"    --> "1478-SL-02" 
"87007-QM-01-J"    --> "87007-QM-01" 
"NE-9315-BM-01-A"    --> "9315-BM-01" 
"3121-SP-01"     --> "3121-SP-01" 
"1639-YL-01"     --> "1639-YL-01" 
"NE-9922-WM-01-J"    --> "9922-WM-01" 
"ND-2498-YL-01"    --> "2498-YL-01" 
"C-4008-PP-03-J"    --> "4008-PP-03" 
"876-C-4008-PP-03-J-234"  --> "4008-PP-03" 

Rにおける [0-9]+-[a-zA-Z]+-[0-9]+の発生(特に第二の発生)を抽出する方法はありますか?

正規表現を使用してパーツを参照することができました。([0-9]+-[a-zA-Z]+-[0-9]+) 私は上記のパターンに最も一致する部分に興味があります。

私はそれを明確にしました。説明が必要な場合はお知らせください。

+2

サブ( "^。*?\\ b([0-9] + - [a-zA-Z] + - [0-9] +)。*"、 "\\ 1"、s ) ' –

答えて

1

開始時に怠惰なドットマッチングパターンを使用し、最後に欲張りのドットマッチングパターンを使用し、置換パターンで後方参照を持つキャプチャグループを使用すると、の文字の数が真ん中には制限数量詞{2,}で少なくとも2:

x <- c("NE-390-SM-04", "90055-SL-01-J", "NE-1478-SL-02", "87007-QM-01-J", "NE-9315-BM-01-A", "3121-SP-01", "1639-YL-01", "NE-9922-WM-01-J", "ND-2498-YL-01", "C-4008-PP-03-J", "876-C-4008-PP-03-J-234") 
sub("^.*?([0-9]+-[a-zA-Z]{2,}-[0-9]+).*", "\\1", x) 

R demoregex demoを参照してください。

パターンはの詳細:

  • ^.*? - 文字列のスタートと0個以上の文字
  • ([0-9]+-[a-zA-Z]{2,}-[0-9]+)できるだけ少ないように - 1+数字、ハイフン、2+文字、ハイフンをマッチングあなたのパターン、 1 +数字
  • .* - 可能な限り0以上の文字列を文字列の最後まで使用します。

あなたがサブパターンに一致する文字で{2,}を使用しない場合は、最後の876-C-4008-PP-03-J-234876-C-4008を取得したいです。

+1

このような詳細な説明Wiktorに感謝します。それは有り難いです。 –

関連する問題