1

皆さん、次のようなプレーン テキストのデータ セットがあるとします。

==Events==
* [[312]] – [[Constantine the Great]] is said to have received his famous [[Battle of Milvian Bridge#Vision of Constantine|Vision of the Cross]].
* [[710]] – [[Saracen]] invasion of [[Sardinia]].
* [[939]] – [[Edmund I of England|Edmund I]] succeeds [[Athelstan of England|Athelstan]] as [[King of England]].
*[[1275]] – Traditional founding of the city of [[Amsterdam]].
*[[1524]] – [[Italian Wars]]: The French troops lay siege to [[Pavia]].
*[[1553]] – Condemned as a [[Heresy|heretic]], [[Michael Servetus]] is [[burned at the stake]] just outside [[Geneva]].
*[[1644]] – [[Second Battle of Newbury]] in the [[English Civil War]].
*[[1682]] – [[Philadelphia]], [[Pennsylvania]] is founded.

NSDictionary年 (左側の数字) を抜粋 (右側のテキスト) にマッピングできるように、何らかの形のコレクションを作成したいと考えています。これが「テンプレート」のようなものです:

*[[YEAR]] – THE_TEXT

[[ただし、抜粋はプレーン テキスト、つまり wiki マークアップがないため、セットもありません。実際、これは などのエイリアス リンクでは難しいことがわかります[[Edmund I of England|Edmund I]]

私は正規表現の経験があまりないので、いくつか質問があります。最初にデータの「美化」を試みる必要がありますか? たとえば、常に となる最初の行を==Events==削除し、[[との]]出現を削除しますか?

または、おそらくより良い解決策:これをパスで行う必要がありますか? たとえば、最初のパスでは、各行を* [[710]]とに分けることができ[[Saracen]] invasion of [[Sardinia]]ます。それらを別の に保存しますNSArrays

次に、最初の年を経てNSArray、テキストのみを取得します[[]]紀元前530年になる可能性があるため、数値ではなくテキストと言います)。* [[710]]710

そして、抜粋については、NSArrayを調べて、[[some_article|alias]]が見つかった場合は[[alias]]、それをなんとかしてだけにしてから、[[]]セットをすべて削除しますか?

これは可能ですか?正規表現を使用する必要がありますか? 役立つ正規表現のアイデアはありますか?

ありがとう!ほんとうにありがとう。

編集:混乱して申し訳ありませんが、上記のデータのみを解析したいです。これが、私が遭遇する唯一のタイプのマークアップであると想定してください。これを行う既存のライブラリがすでに存在しない限り、私は一般的に wiki マークアップを解析することを必ずしも楽しみにしているとは限りません。再度、感謝します!

4

3 に答える 3

3

このコードは、RegexKitLiteを使用していることを前提としています。

NSString *data = @"* [[312]] – [[Constantine the Great]] is said to have received his famous [[Battle of Milvian Bridge#Vision of Constantine|Vision of the Cross]].\n\
    * [[710]] – [[Saracen]] invasion of [[Sardinia]].\n\
    * [[939]] – [[Edmund I of England|Edmund I]] succeeds [[Athelstan of England|Athelstan]] as [[King of England]].\n\
    *[[1275]] – Traditional founding of the city of [[Amsterdam]].";

    NSString *captureRegex = @"(?i)(?:\\* *\\[\\[)([0-9]*)(?:\\]\\] \\– )(.*)"; 

    NSRange captureRange;
    NSRange stringRange;
    stringRange.location = 0;
    stringRange.length = data.length;

    do 
    {
        captureRange = [data rangeOfRegex:captureRegex inRange:stringRange];
        if ( captureRange.location != NSNotFound )
        {
            NSString *year = [data stringByMatching:captureRegex options:RKLNoOptions inRange:stringRange capture:1 error:NULL];
            NSString *textStuff = [data stringByMatching:captureRegex options:RKLNoOptions inRange:stringRange capture:2 error:NULL];
            stringRange.location = captureRange.location + captureRange.length;
            stringRange.length = data.length - stringRange.location;
            NSLog(@"Year:%@, Stuff:%@", year, textStuff);
        }
    }
    while ( captureRange.location != NSNotFound );

これらをうまく構築するには、本当に正規表現について研究する必要があることに注意してください。しかし、私が言っていることは次のとおりです。

(?i)

大文字と小文字を区別しないでください。文字が一致しないため、省略できた可能性があります。

(?:\* *\[\[)

?:は、このブロックをキャプチャしないことを意味します。*をエスケープして一致させ、0個以上のスペース( "*")があり、2つのブラケットをエスケープします(ブラケットも正規表現の特殊文字であるため)。

([0-9]*)

数字であるものは何でもつかみます。

(?:\]\] \– )

ここで、基本的に「–」に一致するものを再び無視します。正規表現内の「\」に注意してください。「\」は文字列内の特殊文字であるため、上記のObjective-C文字列に別の文字列を追加する必要があります。 Obj-C文字列では「\\」として表示されます。

(.*)

他のものを取得するだけです。デフォルトでは、RegEXエンジンは行の終わりで一致を停止します。そのため、他のすべてと一致するわけではありません。テキストから[[LINK]]のものを取り除くためのコードを追加する必要があります。

NSRange変数は、元の一致を再一致させることなく、ファイル全体の一致を維持するために使用されます。いわば。

RegExKitLiteクラスファイルを追加した後は、特別なリンカーフラグも追加する必要があることを忘れないでください。そうしないと、多くのリンクエラーが発生します(RegexKitLiteサイトにはインストール手順があります)。

于 2009-10-30T02:54:17.750 に答える
0

私は正規表現が苦手ですが、これは彼らの仕事のように聞こえます。正規表現を使用すると、これを簡単に整理できると思います。

RegexKitLiteライブラリをご覧ください。

于 2009-10-27T22:32:35.263 に答える
0

一般的にウィキテキストを解析できるようにしたい場合は、やるべきことがたくさんあります。複雑な要因の 1 つに、テンプレートがあります。これらに対処するためにどれだけの努力をしたいですか?

これについて真剣に考えているなら、ウィキテキストを解析する既存のライブラリを探しているはずです。簡単に調べてみると、この CPAN ライブラリが見つかりましたが、私は使用していないため、個人的な推奨事項として挙げることはできません。

または、より単純なアプローチを取り、ウィキテキストのどの部分に対処するかを決定することもできます。これは、たとえば、リンクや見出しであっても、リストではない場合があります。次に、これらのそれぞれに焦点を当て、ウィキテキストをあなたが望むものに変えなければなりません。はい、正規表現はこの点で非常に役立ちます。正規表現を読んで、特定の問題がある場合は、戻って質問してください。

幸運を!

于 2009-10-27T22:50:31.950 に答える