0

更新0

以下のコードを追加しましたfor (... match in)

更新0

私の原文は約40行ごとに繰り返されます。以下に、以下の2回の繰り返しごとに8行を示します。完全なデータセットはここにあります。「[Board]」行から、引用符の間に1桁または2桁の数字が必要です。「[Dealer]」行から、引用符の間に1文字が必要です。

[Board "1"]
[Dealer "N"]
[Vulnerable "None"]
[Deal "N:Q952.652.KJT4.95 T.KQT84.A865.J73 K8763.A7.Q.KQT84 AJ4.J93.9732.A62"]
[Scoring ""]
[Declarer ""]
[Contract ""]

[Board "2"]
[Dealer "E"]
[Vulnerable "NS"]
[Deal "E:K8542.3.4.AT7532 J76.K7.AT85.KQJ8 QT3.AJ84.KJ963.4 A9.QT9652.Q72.96"]
[Scoring ""]
[Declarer ""]
[Contract ""]

次の正規表現は機能しますが、私のテキストの30以上の一致ではなく、1つの一致のみを取得します。

NSString *toMatch = @"\\[Board \"([0-9][0-9]?)\"\\].*\\[Dealer \"([NEWS])\"\\]";
NSRegularExpression *regex = [NSRegularExpression  regularExpressionWithPattern:toMatch options:NSRegularExpressionDotMatchesLineSeparators error:&error];
for (NSTextCheckingResult* match in [regex matchesInString:string options:NSRegularExpressionDotMatchesLineSeparators range:NSMakeRange(0, [string length])])
    {
        NSLog(@"Number of ranges in match: %u", match.numberOfRanges);
        for (NSUInteger i = 0; i < match.numberOfRanges; ++i)
        {
            NSRange matchedRange = [match rangeAtIndex: i];
            NSString* tstring = [string substringWithRange: matchedRange];
            NSLog(@"range %lu string: %@", (unsigned long)i, tstring);
        }
    }

問題はラインフィードにあると思われますが、修正方法とオプションがわかりません。これは、この質問の続きです。

複数の一致を取得するために正規表現パターンを修正するにはどうすればよいですか?

(さらに、「[Deal]」行に次のものが必要ですが、今は無視しましょう。最初は「:」の後、スペースの前、2番目と3番目はスペースの間にある4つの別々のグループが必要です。最後は、最後のスペースの後、引用符の前のすべてです。)

4

2 に答える 2

3

私は間違っているかもしれませんが、あなたのパターンの問題は、あなたが持っていて.* あなたが選択NSRegularExpressionDotMatchesLineSeparatorsしたことだと思います。それは、ソーステキストの最後の出現に達するまですべて.*に一致します。[Dealer

.*を使用して、を「貪欲でない」バージョンに変えることができ.*?ます。あるいは、を使用せ.*ずに置き換えることもでき\\nます(入力が単一で区切られていると仮定します\n)。正規表現コンパイラが\and n(改行文字と一致する認識されたエスケープシーケンス)を確認するに\は、NSStringでエスケープする必要があるため、次を使用する必要があることに注意してください\\n

NSString *toMatch = "\\[Board \"([0-9][0-9]?)\"\\]\\n\\[Dealer \"([NEWS])\"\\]";

ソーステキストにWindowsの行末がある場合は、\\r\\n代わりに使用できます。

于 2013-02-04T03:48:46.607 に答える
0

この(エスケープされていない)パターンを試してください:

\[(\w+)\s+\"([^\"]*)\"\]

最初のグループはタグ名であり、2番目に一致するグループは引用符の間の内容です。これらの値は、コード\1でそれぞれとを使用してキャプチャできる場合があります。\2

于 2013-02-04T02:50:41.183 に答える