0

私は Java での正規表現は初めてで、このテキストからすべての「lesson#」を抽出しようとしています:

<a id="lesson1" href="lesson1.html">Lesson 1</a>
<a id="lesson2" href="lesson2.html">Lesson 2</a>
<a id="lesson3" href="lesson3.html">Lesson 3</a>
<a id="lesson4" href="lesson4.html">Lesson 4</a>
<a id="lesson5" href="lesson5.html">Lesson 5</a>
<a id="lesson6" href="lesson6.html">Lesson 6</a>
<a id="lesson7" href="lesson7.html">Lesson 7</a>
<a id="lesson8" href="lesson8.html">Lesson 8</a>
<a id="lesson9" href="lesson9.html">Lesson 9</a>

このコードを使用して、文字列からその部分を抽出しています。

String s = ""
        + "<a id=\"lesson1\" href=\"lesson1.html\">Lesson 1</a>\n"
        + "<a id=\"lesson2\" href=\"lesson2.html\">Lesson 2</a>\n"
        + "<a id=\"lesson3\" href=\"lesson3.html\">Lesson 3</a>\n"
        + "<a id=\"lesson4\" href=\"lesson4.html\">Lesson 4</a>\n"
        + "<a id=\"lesson5\" href=\"lesson5.html\">Lesson 5</a>\n"
        + "<a id=\"lesson6\" href=\"lesson6.html\">Lesson 6</a>\n"
        + "<a id=\"lesson7\" href=\"lesson7.html\">Lesson 7</a>\n"
        + "<a id=\"lesson8\" href=\"lesson8.html\">Lesson 8</a>\n"
        + "<a id=\"lesson9\" href=\"lesson9.html\">Lesson 9</a>\n"
        + "";

Pattern pattern = Pattern.compile("id=\"(lesson[0-9])");
Matcher m = pattern.matcher(s);

System.out.println("Find: " + m.find())
System.out.println("Matches: " + m.matches());

if (m.matches()) {
   System.out.println("Group 0: " + m.group(0));
}

このコードで得られる出力は次のとおりです。

Find: true
Matches: false

そしてjavadocsで、m.matchesがfalseを返すとグループにアクセスできないことを読みました。

m.find() が true を返すのに、m.matches() が false を返すのはなぜですか? このコードではグループにアクセスできません。

4

4 に答える 4

0

次のコードを試してください。

    String data = "" + "<a id=\"lesson1\" href=\"lesson1.html\">Lesson 1</a>\n"
            + "<a id=\"lesson2\" href=\"lesson2.html\">Lesson 2</a>\n"
            + "<a id=\"lesson3\" href=\"lesson3.html\">Lesson 3</a>\n"
            + "<a id=\"lesson4\" href=\"lesson4.html\">Lesson 4</a>\n"
            + "<a id=\"lesson5\" href=\"lesson5.html\">Lesson 5</a>\n"
            + "<a id=\"lesson6\" href=\"lesson6.html\">Lesson 6</a>\n"
            + "<a id=\"lesson7\" href=\"lesson7.html\">Lesson 7</a>\n"
            + "<a id=\"lesson8\" href=\"lesson8.html\">Lesson 8</a>\n"
            + "<a id=\"lesson9\" href=\"lesson9.html\">Lesson 9</a>\n" + "";

    Pattern pattern = Pattern.compile("\\>([Ll]esson\\s+\\d+)");
    Matcher matcher = pattern.matcher(data);

    while (matcher.find()) {
        System.out.println(matcher.group(1));
    }

お役に立てれば。

于 2013-03-19T17:14:58.787 に答える
0

あなたはただする必要があります:

if (m.find()) {
   System.out.println(m.group(1));
}
  • group(1)の代わりに、group(0)一致group(0)全体を返しgroup(1)ますが、最初の括弧のグループを返します。
  • またはのいずれm.find()かを実行しますm.matches()。違いは、m.matches()文字列全体を一致させる必要があることです(Java Regexのmatches()とfind()の違いを参照)。正規表現は文字列内の部分文字列とのみ一致するため、matches()失敗してfind()検出されます。
于 2013-03-19T17:16:18.533 に答える