0

次のマークアップ入力を検討してください。

* ライン1
* 2行目
:* 行 2.1
:* 2.2行目
* 3 行目

これは通常、次のようにコード化されます。

  <ul>
    <li>1行目</li>
    <li>2行目</li>
    <ul>
      <li>ライン 2.1</li>
      <li>2.2行目</li>
    </ul>
    <li>3行目</li>
  </ul>

私の質問:

  • 単一の線を使用して同じ入力を適切に表現するにはどうすればよいでしょうか?
  • 対応する XHTML を生成するための正規表現は何ですか?

たとえば、1 行の入力形式は次のようになります。

> 1号線 > 2号線 >> 2.1号線 >> 2.2号線 > 3号線

順序付けられて>いないリスト項目の区切り文字です。>テキストに典型的な句読点が含まれている可能性があるため、選択しました。» (またはその他の非 104 キー キー) を使用すると楽しいですが、入力するのは簡単ではありません。

行入力形式は次のようにもできます。

[1行目][2行目] [2.1行目][2.2行目]][3行目]

更新 #1 - 問題は少し単純です。ネストの数は 3 つに制限できます。nレベルの深さの一般的な解決策は、まだクールです。

更新 #2 - HTML ではなく XHTML。

更新 #3 - 別の可能な入力形式。

更新 #4 - Java ソリューション (または純粋な正規表現) は大歓迎です。

アップデート #5

改訂されたコード:

String in = " * Line 1 * Line 2 > * Line 2.1 * Line 2.2 < * Line 3";

String sub = "<ul>" + in.replace( " > ", "<ul>" ) + "</ul>";

sub = sub.replace( " < ", "</ul>" );

sub = sub.replaceAll( "( | >)\\* ([^*<>]*)", "<li>$2</li>" );

System.out.println( "Result: " + sub );

以下を出力します。

Result: <ul><li>Line 1 </li>* Line 2<ul>* Line 2.1<li>Line 2.2</li></ul>* Line 3

4

3 に答える 3

3

あなたの例は私にはうまくいくようです。

 > Line 1 > Line 2 >> Line 2.1 >> Line 2.2 > Line 3

残念ながら、純粋な RegEx は、現在のネスト レベルを追跡できないため、/UL終了タグをどこに配置すればよいかわかりません。

このようなものがうまくいくかもしれません:

 * Line 1 * Line 2 > * Line 2.1 * Line 2.2 < * Line 3

ここで、大なり小なりは階層を上下に移動し、アスタリスクは箇条書きの区切り文字です。それぞれの前後のスペースは一種のエスケープ シーケンスとして使用されるため、スペースで囲まれていない場合は、これらの文字をそのまま使用したり、斜体や太字などの他の目的で使用したりできます。

正規表現での刺し傷:

 string ol = "<ul>" & RegEx.Replace(t, " > ", "<ul>") & "</ul>";
 ol = RegEx.Replace(ol, " < ", "</ul>");
 ol = RegEx.Replace(ol, "( |>)\\* ([^*<>]*)", "<li>\\2</li>"); 

編集:以下のコメントに基づいて、XHTML を生成するように調整し、LI タグを閉じます。C# 構文も修正しました。

最終編集:最後の Replace の \ * と \ 2 は、C# 用にエスケープする必要があると思います。また、最初の 2 つの Replace() 呼び出しは、おそらく高速な RegEx ではなく String.Replace() を使用できることに注意してください。

于 2009-08-28T23:55:42.617 に答える
0

解決

実用的なソリューションは次のとおりです。

public class Test {
  public Test() {
  }

  public static void main( String[] args ) {
    String in = "= Line 1 = Line 2 > = Line 2.1 = Line 2.2 < = Line 3";

    in = in.replaceAll( "= ([^=<>]*)", "<li>$1</li>" );
    in = in.replace( ">> ", "><ul>" );
    in = in.replace( ">< ", "></ul>" );
    in = "<ul>" + in + "</ul>";
    System.out.println( in );
  }
}

これにより、目的の XHTML フラグメントが作成されます。

<ul><li>Line 1 </li><li>Line 2 </li><ul><li>Line 2.1 </li><li>Line 2.2 </li></ul><li>Line 3</li></ul>
于 2009-08-31T20:36:22.790 に答える
0

正規表現を解析および変換ツールとして使用することはお勧めしません。正規表現はオーバーヘッドが高くなる傾向があり、言語を解析する最も効率的な手段ではありません...これは、あなたが本当に求めていることです。シンプルな言語を作成したので、そのように扱う必要があります。WIKI スタイルのフォーマット コード専用の実際のパーサーを作成することをお勧めします。パーサーを特にあなたの言語に向けることができるので、より効率的であるはずです。さらに、言語を解析してすべてのニュアンスを処理するための正規表現である恐ろしい怪物を作成する必要はありません。長期的には、コードがより明確になり、保守性が向上するなどのメリットが得られます。

次のリソースをお勧めします。

于 2009-08-31T18:33:25.673 に答える