2011-07-28 2 views
2

正規表現に問題があります。複数のテキストをキャプチャします。

たちは、文字列に

S= "[sometext1],[sometext],[sometext]....,[sometext]" 

「sometexts」の数を持って考えてみて、それがユーザーの入力だと、1000年の例を..forするものから変えることができ、不明です。

[sometext]はいくつかの文字列ですが、それぞれが "、"ではないので、[^、]と言うことができます。

テキストをいくつかの正規表現でキャプチャしてから、テキストを繰り返し処理します。例えば

QRegExp p=new QRegExp("???"); 
p.exactMatch(S); 
for(int i=1;i<=p.captureCount;i++) 
{ 
    SomeFunction(p.cap(i)); 
} 

sometextsの数が3であれば、我々はこのようなものを使用することができ、:だから

([^,]*),([^,]*),([^,]*). 

を、私は「???」の代わりに書くことがわかりません任意のnに対して。 Qt 4.7を使用していますが、クラス参照ページでこれを行う方法が見つかりませんでした。
私たちは、正規表現を持たないサイクルやサイクルで正規表現自体を生成することができますが、実際の問題はこれよりも複雑であるため、私には合いません。

+0

Regexesは無限の数のキャプチャグループを作成できません... – Nightfirecat

答えて

3

可能正規表現は、あなたが望むものと一致することがありますラインの終わり。私は最後の要素が昏睡状態になるかどうか確信していませんでした。

C#でこの正規表現を使用して

例:

String textFromFile = "[sometext1],[sometext2],[sometext3],[sometext4]"; 

foreach (Match match in Regex.Matches(textFromFile, "([^,]+?)(,|$)")) 
{ 
    String placeHolder = match.Groups[1].Value; 

    System.Console.WriteLine(placeHolder); 
} 

このコードは、画面に次のように出力されます

[sometext1] 
[sometext2] 
[sometext3] 
[sometext4] 

QRegexのための例を使用して、私はここにオンラインで見つけるには近いソリューションの試みでありますあなたが探しているものに: (見つかった例は:http://doc.qt.nokia.com/qq/qq01-seriously-weird-qregexp.htmlでした)

QRegExp rx("([^,]+?)(,|$)"); 
rx.setMinimal(TRUE); // this is if the Qregex does not understand the +? non-greedy notation. 

int pos = 0; 
while ((pos = rx.search(text, pos)) != -1) 
{ 
    someFunction(rx.cap(1)); 
} 

こちらがお役に立てば幸いです。

+0

はい、おそらくこれを使用します。ありがとう。同じ型の指定された式の接尾辞と接頭辞もありますが、区切り記号が異なるので、これをすべて単一の正規表現で表現することができます。ITの奇妙なことは、正規表現の現在のバージョンではサポートされていません。私はそれが彼らの開発者のために行く良い方法かもしれないと思う:) –

+1

喜んで私は助けることができた。 – Rob

0

できますそれは、あなたがコンマにフックする非キャプチャを使用して、ブロックの多くを求めることができます:

試してみてください。

QRexExp p=new QRegExp("([^,]*)(?:,([^,]*))*[.]") 

非キャプチャがドキュメントで説明されています。http://doc.qt.nokia.com/latest/qregexp.html

RegExpで意味があるので、私は.を括弧で括っています。あなたはそれを文字通りの期間にしたいと思っていました。

+0

これは動作しません。最初の "sometext"をキャプチャし、その後2番目のテキストをキャプチャしますが、それ以上はありません:) –

+0

ループ内のcap()。その奇妙なことを忘れてしまった。 ;-(マニュアルでより詳しく説明しています:http://doc.qt.nokia.com/latest/qregexp.html#capturing-text – Mark

0

私はあなたが単一の
式で可変数のキャプチャを指定できるように知っています。例 - (capture。* me)+
これは、繰り返し可能なキャプチャオブジェクトを作成します。それでも、他のすべての正規表現エンジンが提供するものだけをシミュレートします。

ほとんどのエンジンは、
ループ内で一致がなくなるまで増分一致を提供します。 globalフラグは、最後の
の一致が途切れる場所から一致を維持するようにエンジンに指示します。 (Perlで)

例: ""

([^,]+?)(,|$) 

これは昏睡状態で終了する文字列に一致しますか:

while ($string =~ /([^,]+)/g) { print $1,"\n" }

関連する問題