2017-09-08 6 views
1

私は文字ベクトルであるレコードのリストを持っています。私は2つのサブストリング1mil__ks_drivers_sorted.csvの間で何でも抽出したいこれらの名前から正規表現を使用して2つの部分文字列の間に一致する部分文字列を返します

'1mil_0,1_1_1_lb200_ks_drivers_sorted.csv' 
'1mil_0_1_lb100_ks_drivers_sorted.csv' 
'1mil_1_1_lb2_100_100_ks_drivers_sorted.csv' 
'1mil_1_1_lb100_ks_drivers_sorted.csv' 

:ここでは例です。

したがって、この場合の出力は次のようになります。

0,1_1_1_lb200 
0_1_lb100 
1_1_lb2_100_100 
1_1_lb100 

私はので、私はこれを行うにはregexpを使用することを考えたが、私は正しいだろう正規表現の種類を理解することはできませんMATLABを使用しています。

regexpを使用せずにこれを行うにはいくつかの方法がありますか?

+0

'1mil " "と" "と "1mil_"" と" _ks_drivers_sorted.csvを交換するExemple _(。*)_ ks_drivers_sorted \ .csv'と何@anubhavaキャプチャグループ#1 – anubhava

+0

を使用「キャプチャされたグループ#1を使用する」という意味ですか? – jackscorrow

答えて

4

データがあることしてみましょう:正規表現は一つだけのマッチを生成するので、

result = cellfun(@(c) regexp(c, '(?<=1mil_).*(?=_ks_drivers_sorted\.csv)', 'match'), x); 

または:

x = {'1mil_0,1_1_1_lb200_ks_drivers_sorted.csv' 
    '1mil_0_1_lb100_ks_drivers_sorted.csv' 
    '1mil_1_1_lb2_100_100_ks_drivers_sorted.csv' 
    '1mil_1_1_lb100_ks_drivers_sorted.csv'}; 

は、次の2つの制限のサブストリングを見つける、との間のすべてを一致させるためにlookbehind and lookaheadを使用することができます以下の簡単な代替案を使用することができます(告知のために@excazaに感謝):

result = regexp(x, '(?<=1mil_).*(?=_ks_drivers_sorted\.csv)', 'match', 'once'); 
あなたの例では

、これを行うには、上記のいずれかが、私にとっては

result = 
    4×1 cell array 
    '0,1_1_1_lb200' 
    '0_1_lb100' 
    '1_1_lb2_100_100' 
    '1_1_lb100' 
+1

正確に私が必要としたもの。ありがとうございました! – jackscorrow

+1

'result = regexp(x、 '(?<= 1mil _)。*(?= _ ks_drivers_sorted.csv)'、 'match'); [result {:}]。 ''(あなたが' cellfun'を避けたいのなら) –

+0

@SardarUsamaいい考えです。しかし、私は 'result = [result {:}] 'が' result = cellfun(@(c)...、x) 'よりはるかに明確であると確信していません。 –

0

を与える簡単な方法は、ちょうどあなたがあなたの文字列にする必要はありません何を交換するエスパスまたは何もを使用し、残りは何です必要。

Ifはリストで、これを行うにはループを使用できます。

newChr = strrep(chr,'1mil_','') 
newChr = strrep(chr,'_ks_drivers_sorted.csv','') 
関連する問題