无法让小组工作

时间:2013-03-19 17:03:49

标签: java regex match regex-group

我是Java的正则表达式的新手,我正试图从本文中提取所有“课程#”:

<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 个答案:

答案 0 :(得分:2)

matches方法尝试将整个输入序列与模式匹配。您应该在循环中调用Matcher.find(),直到它返回false。每次拨打Matcher.find()时,您都可以访问当前找到的事件组。

while (m.find()) {
   String someGroup = m.group(1);
}

答案 1 :(得分:1)

这是你问题上半部分的答案。

来自Javadoc

“find方法扫描输入序列,寻找与模式匹配的下一个子序列。”

“matches方法尝试将整个输入序列与模式匹配。”

不同之处在于find方法在字符串中的任何位置查找正则表达式的匹配项,而matches方法仅在整个输入匹配时才返回true。 特别是,你的正则表达式以id =开头,而你的字符串以<a开头,所以你不会得到匹配。

答案 2 :(得分: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));
    }

希望这有帮助。

答案 3 :(得分:0)

你只需要这样做:

if (m.find()) {
   System.out.println(m.group(1));
}
  • group(1)而非group(0)因为group(0)返回整个匹配,而group(1)则返回第一个括号的组。
  • 您执行m.find()m.matches()。区别在于m.matches()需要匹配整个字符串(请参阅Difference between matches() and find() in Java Regex)。您的正则表达式只匹配字符串中的子字符串,因此matches()失败并且find()找到。