2010-12-03 9 views
1

大きな脚注のすべての脚注を交換しようとしています。 Objective-Cでこれをやっている理由はたくさんあるので、その制約を仮定してください。これでRegexKitLite:マッチ式 - >マッチするもの以外] - >マッチ]

すべての脚注人間:[脚注

すべての脚注は、これで終了:]

は、改行を含め、これらの二つのマーカー、間に絶対に何が存在する場合があります。しかし、それらの間には決して存在しないでしょう。

本質的に、[脚注、次に一致するもの以外]、[]が一致するまでしたいです。

これは、私は脚注のすべてを識別することに得ることができた最も近い:この正規表現を使用して

NSString *regexString = @"[\\[][F][o][o][t][n][o][t][e][^\\]\n]*[\\]]"; 

は889分の780の脚注を識別するために管理しています。また、780のどれも誤認警報ではないようです。欠落していると思われるのは、改行が入っている脚注だけです。

私はwww.regular-expressions.info、特にドットに関するページ(http://www.regular-expressions.info/dot.html)に長い時間をかけてきました。これは上記の正規表現を作成するのに役立ちましたが、右括弧以外の文字や改行をどのように組み込むかを本当に考えていません。代わりに、次の正規表現を使用して

は、脚注のすべてをキャプチャするために管理しますが、*は貪欲であるため、それは、あまりにも多くのテキストをキャプチャ:

:ここ (?s)[\\[][F][o][o][t][n][o][t][e].*[\\]]

は、正規表現が上で実行されるいくつかのサンプルテキストです

<p id="id00082">[Footnote 1: In the history of Florence in the early part of the XVIth century <i>Piero di Braccio Martelli</i> is frequently mentioned as <i>Commissario della Signoria</i>. He was famous for his learning and at his death left four books on Mathematics ready for the press; comp. LITTA, <i>Famiglie celebri Italiane</i>, <i>Famiglia Martelli di Firenze</i>.—In the Official Catalogue of MSS. in the Brit. Mus., New Series Vol. I., where this passage is printed, <i>Barto</i> has been wrongly given for Braccio.</p> 

    <p id="id00083">2. <i>addi 22 di marzo 1508</i>. The Christian era was computed in Florence at that time from the Incarnation (Lady day, March 25th). Hence this should be 1509 by our reckoning.</p> 

    <p id="id00084">3. <i>racolto tratto di molte carte le quali io ho qui copiate</i>. We must suppose that Leonardo means that he has copied out his own MSS. and not those of others. The first thirteen leaves of the MS. in the Brit. Mus. are a fair copy of some notes on physics.]</p> 

    <p id="id00085">Suggestions for the arrangement of MSS treating of particular subjects.(5-8).</p> 

When you put together the science of the motions of water, remember to include under each proposition its application and use, in order that this science may not be useless.-- 

[Footnote 2: A comparatively small portion of Leonardo's notes on water-power was published at Bologna in 1828, under the title: "_Del moto e misura dell'Acqua, di L. da Vinci_".] 

この例では、2つの脚注といくつかの脚注外のテキストがあります。最初の脚注には、2つの改行が含まれています。 2番目の行に改行は含まれません。

上記の最初の正規表現では、この例のテキストで脚注2を取り込むことができますが、脚注1には改行が含まれているため、脚注1は取り込まれません。

私の正規表現の改善が最も高く評価されます。

答えて

3

これは改行間で一致する必要があり

@"\\[Footnote[^\\]]*\\]"; 

を試してみてください。 1つの文字を文字クラスに入れる必要はありません。 (文字列エスケープなし)コメント、複数行の正規表現として

:文字クラス([...])インサイド

\[  # match a literal [ 
Footnote # match literal "Footnote" 
[^\]]* # match zero or more characters except ] 
\]  # match ] 

、キャレット^は異なる意味を持ちます。クラスの内容を否定します。従って[ab]aまたはbと一致しますが、[^ab]aまたはb以外の任意の文字に一致します。

もちろん、ネストされた脚注があると、これは誤動作します。[Footnote foo [footnote bar] foo]のようなテキストは、最初からbar]まで一致します。これを避けるには、正規表現を

@"\\[Footnote[^\\]\\[]*\\]"; 

に変更して、開き角か括弧を使用できないようにします。もちろん、最も内側の脚注にのみ一致し、テキスト全体に同じ正規表現を2回以上(ネスティングの最大レベルに応じて)適用する必要があります。レイヤーごとに「ピーリングバック」します。

+0

これは動作するようです。それは883回にマッチしますが、脚注(889)のすべてを置き換えます。したがって、1つではなく2つの脚注を取り込むのは明らかに6回です。おそらく3つのネストされた脚注がありますか?それらを見つけるのに私はしばらく時間がかかります。 これはなぜ機能しますか?私は[^ \\]] *の仕組みを理解していません。右括弧で始まる行を探してはいけませんか?私は^文字が "行頭にマッチする"と考えられていたと思った。 –

+0

@kienjakenobi:私は自分の答えを編集しました。 –

+0

素晴らしい!ありがとうございました!あなたの説明は理にかなっています。 –