2017-09-14 1 views
2

文字列があり、正規表現を使用して、文字:と他の文字/の間の文字グループを抽出します。 は一般的に、ここで私が得ていた文字列の例です:正規表現を使用して文字で始まり、終わる文字列のグループを検索します。

'abcd:45.72643,4.91203/Rou:hereanotherdata/defgh' 

、彼らは文字:/の間の両方であるように、私はまた、検索、45.72643,4.91203hereanotherdata にしたいです。

私は、わずか1時間のパターンがあり簡単に文字列で、この構文を使用して

[tt]=regexp(str,':(\w.*)/','match') 

tt = ':45.72643,4.91203/' 

を試してみましたが、それはパターンが一度発生した場合にのみ機能します。パターンの倍数を含む文字列で使用すると、最初の:と最後の/の間の文字列がすべて取得されます。

どのようにパターンが複数回発生すると私はそれを取得することができます言及できますか?

答えて

2

を使用lookaroundlazy quantifier

regexp(str, '(?<=:).+?(?=/)', 'match') 

例(MatlabのR2016b):

>> str = 'abcd:45.72643,4.91203/Rou:hereanotherdata/defgh'; 
>> result = regexp(str, '(?<=:).+?(?=/)', 'match') 
result = 
    1×2 cell array 
    '45.72643,4.91203' 'hereanotherdata' 
+0

ありがとう!うまくいくようです。構文を解読するのに時間がかかりましたが、私はそれを得たと思います。 :) – Tiri

+0

これは正規表現で起こります:-D –

1

ほとんどの言語では、これは単一の正規表現では困難です。最終的にはあなたはたった1つの文字列を取得し、複数の文字列を取得したいとします。

それはその言語で可能かもしれないので、私は、MATLABを使用したことがありませんが、他の言語に基づいて、これは私がそれに近づくだろう方法です...

私はあなたの正確なコードを与えることはできませんしかし、検索は、MATLABでstrsplitという関数があることを示して使用して、最大文字列の配列にあなたの元の文字列を破るだろう必要がありますたとえば...

C = strsplit(data,':') 

「を:」ブレークポイントとして。最初の配列インデックス( ":"の前にテキストが含まれているので)を無視し、残りの配列をループし、 "/"の前にあるすべてのものを抽出するようにregexpすることができます。したがって、例えば

...ダウン部品の配列に

'abcd:45.72643,4.91203/Rou:hereanotherdata/defgh' 

ブレーク...

1 - 'abcd' 
2 - '45.72643,4.91203/Rou' 
3 - 'hereanotherdata/defgh' 

そして1を無視し、 "/" 2及び3の前にすべてを抽出します

+0

実際には、MATLABでは二重の 'strsplit'を実行できます。 – Adriaan

0

John MawerとAdriaanが言及したように、strsplitはまずは良い場所です。 ':'と '/'の両方に使用することはできますが、起動した場所を特定することはできません。あなたが二回strsplitでそれを行う場合は、あなたが知っていることができる場所「:」開始:「:」

A='abcd:45.72643,4.91203/Rou:hereanotherdata/defgh'; 
B=cellfun(@(x) strsplit(x,'/'),strsplit(A,':'),'uniformoutput',0); 

今Bで始まるセルを有し、また、「/」が含まれ、各セルに2つのセルを有します。あなたは、Bが一つのセルよりも多くを持っているところをチェックして、それを抽出し、それらのそれぞれの最初のをとることができます。

C=cellfun(@(x) x{1},B(cellfun('length',B)>1),'uniformoutput',0) 

C = 

1×2 cell array 

    '45.72643,4.91203' 'hereanotherdata' 
+0

はい、strsplitは私が今まで使っていたものでした。しかし、私は正規表現がより簡単にそれを行うことができると考えていました。感謝 – Tiri

0

16bに開始あなたはextractBetweenを使用することができます。

>> str = 'abcd:45.72643,4.91203/Rou:hereanotherdata/defgh'; 
>> result = extractBetween(str,':','/') 

result = 

    2×1 cell array 

    {'45.72643,4.91203'} 
    {'hereanotherdata' } 

すべてのテキスト要素に同じ数のデリミタがある場合、これもベクトル化できます。

+0

wow私はこの機能を知らなかった!それは新しいものです。それはいいです、私は2016bで働いています。私はこの機能を詳細にチェックします。ありがとう! – Tiri

関連する問題