0

私はこのテキストを持っています:

<blockquote>1. тест1; тест2; </blockquote>
<blockquote>2. тест1; тест2; </blockquote>
<blockquote>1) тест1; тест2; </blockquote>
<blockquote>2) тест1; тест2; </blockquote>
<blockquote>1. 1) тест1; тест2; </blockquote>
<blockquote>1) 1. тест1; тест2; </blockquote>
<blockquote>1. тест </blockquote>

それを使って тест1; を抽出できる表現を教えてください。тест2; この文字列の変数に? тест1; тест2; - はキリル文字です。したがって、抽出 тест には ([\p{IsCyrillic}]*) 式を使用する必要があります。

String pattern = "(.*)<blockquote>1. ([\\p{IsCyrillic}]*) </blockquote>(.*)";

最初のバリアントでのみ機能します。このバリアントの表現は何ですか? (または、文字列のバリアントごとに特定の表現を教えてもらえますか?

4

4 に答える 4

2

元の投稿のすべての文字列: -

String pattern = "(.*)<blockquote>[\\d[\\.\\)]\\s]+([[\\p{IsCyrillic}][\\d\\;\\s]+]+) </blockquote>(.*)";

以下に示す新しい要件文字列には、次のパターンを使用します。 -

String str = "<blockquote>1. тест </blockquote><blockquote>2. 1) ветка; метрика </blockquote>";

String p = "[(.*)<blockquote>[\\d[\\.\\)]\\s]+([[\\p{IsCyrillic}][\\d\\;\\s]+]+) </blockquote>(.*)]+";

тест, ветка; метрикаOK、上記の文字列の 3 つすべてを照合して返すコードは次のとおりです。

String str = "<blockquote>1. тест </blockquote><blockquote>2. 1) ветка; метрика </blockquote>";

Pattern pattern1 = Pattern.compile("(тест)|(ветка;)|(метрика)");

Matcher matcher = pattern1.matcher(str);
while (matcher.find()) {
    System.out.print("Start index: " + matcher.start());
    System.out.print(" End index: " + matcher.end() + " ");
    System.out.println(matcher.group());
}

ただし、fixed文字列に一致させるだけなので、実際には . は必要ありませんregex。通常Stringのクラスメソッドを使用できます。メソッドを使用してString.substring、文字列を検索します。String.indexOfの真の力Regexは、1 つのパターンで複数の文字列を照合することにあります。

于 2012-09-28T10:16:41.470 に答える
0

тест1тест2. _ String.substring()次に、関数を使用して文字列検索を実行できますString.indexOf()。その場合、正規表現は必要ありません。

ただし、タグに異なる文字列を含めることができる場合は、次の正規表現を使用できます。

(?<= ).*?(?=(;| ))

この正規表現は、blockquote タグ内の文字列を個別に選択します。

<blockquote>1. тест1; тест2; </blockquote>
<blockquote>2. тест1; тест2; </blockquote>
<blockquote>1) тест1; тест2; </blockquote>
<blockquote>2) тест1; тест2; </blockquote>
<blockquote>1. 1) тест1; тест2; </blockquote>
<blockquote>1) 1. тест1; тест2; </blockquote>
<blockquote>1. тест </blockquote>

これにより選択されます

тест1 тест2
тест1 тест2
тест1 тест2
тест1 тест2
1) тест1 тест2
1. тест1 тест2
тест

すべてのタグにそれぞれ。

5 番目と 6 番目のタグから1)andを削除する場合は、それに応じて文字列をフォーマットします。1.

ただし、すべてのタグが同じ行にある場合は、それらのタグも選択されます。一致した文字列が<.

于 2012-10-30T08:11:25.857 に答える
0

それはあなたの正確な要件に依存します。これは、先頭の番号付けがスペース、右括弧、ドット、および数字の任意の組み合わせであると想定する、かなり単純化された変更です。

String pattern = 
 "(.*)<blockquote>[\\s\\.\\)\\d]+([\\p{IsCyrillic}\\;\\d\\s]*)</blockquote>(.*)";

更新: 中間セクションがセミコロン、数字、および空白と一致するように編集されました。

更新 2: コメントでの議論を読んだ後、何が必要なのかわかりませんが、これにより、番号付け後の中央セクション全体が一致します。一致するセクションは、キリル文字、セミコロン、数字、および空白の任意の組み合わせにすることができます (数字で始まらない限り)。

于 2012-09-28T10:14:45.960 に答える
-2

ここのパターンは非常に見栄えがよく、機能するはずです。ただし、次のようなことを段階的に行う方が簡単な場合があります。

  public static void main(String[] args){

    String[] testStrings = { "<blockquote>1. тест1; тест2; </blockquote>",
      "<blockquote>2. тест1; тест2; </blockquote>",
      "<blockquote>1) тест1; тест2; </blockquote>",
      "<blockquote>2) тест1; тест2; </blockquote>",
      "<blockquote>1. 1) тест1; тест2; </blockquote>",
      "<blockquote>1) 1. тест1; тест2; </blockquote>" };

    for (String testString : testStrings){

      String result = testString
        .replace("<blockquote>", "")
        .replace("</blockquote>", "")
        .replaceAll("\\d\\.|\\d\\)", "")
        .trim();

      System.out.println(result);
    }
  }
于 2012-09-28T10:18:49.090 に答える