2

Javaでは、のようなテキストでfoo <on> bar </on> thing <on> again</on> now、「foo」、「bar」、空の文字列、「thing」、「again」、「now」を検索するグループを含む正規表現が必要です。

私がそうする場合(.*?)<on>(.*?)</on>(?!<on>)、私は2つのグループしか得られません(foo bar、もう一度、そして私は「今」の終わりではありません)。

foo barの空の文字列(.*?)<on>(.*?)</on>((?!<on>))を取得した場合は、もう一度、空の文字列を取得します(ここでは「今」が必要です)。

魔法の公式は何ですか?

ありがとう。

4

2 に答える 2

2

正規表現でこれを行うことを主張する場合は\s*<[^>]*>\s*、区切り文字として使用してみることができます。

    String text = "foo <on> bar </on> thing <on> again</on> now";
    String[] parts = text.split("\\s*<[^>]*>\\s*");
    System.out.println(java.util.Arrays.toString(parts));
    // "[foo, bar, thing, again, now]"

正確に明確ではないため、これが正確に必要なものであるかどうかはわかりません。


おそらく、このようなものが必要でした:

    String text = "1<on>2</on>3<X>4</X>5<X>6</X>7<on>8</on><X>9</X>10";
    String[] parts = text.split("\\s*</?on>\\s*|<[^>]*>[^>]*>");
    System.out.println(java.util.Arrays.toString(parts));
    // prints "[1, 2, 3, 5, 7, 8, , 10]"

これはネストされたタグを処理しません。それらがある場合は、正規表現をダンプして実際のHTMLパーサーを使用することをお勧めします。

配列の途中に空の文字列を配置したくない場合は、(?:delimiter)+

    String text = "1<on>2</on>3<X>4</X>5<X>6</X>7<on>8</on><X>9</X>10";
    String[] parts = text.split("(?:\\s*</?on>\\s*|<[^>]*>[^>]*>)+");
    System.out.println(java.util.Arrays.toString(parts));
    // prints "[1, 2, 3, 5, 7, 8, 10]"
于 2010-05-21T09:55:54.020 に答える
0

私の推奨事項

  • <on>前後のテキストを一致させる必要はありません</on>
  • 貪欲でないフラグを使用して<on>、次の間のテキストを照合します</on>
  • Matcher.find()可能であれば、ループを使用してすべてのオカレンスをシーケンスします。1つの大きな太った正規表現で一度にすべてを行う必要はありません!
于 2010-05-21T09:55:24.490 に答える