【问题标题】:Can't get groups to work无法让小组工作
【发布时间】:2013-03-08 12:11:52
【问题描述】:

我是 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?我无法使用此代码访问群组,所以我错过了什么?

【问题讨论】:

  • 请不要使用正则表达式来处理HTML,因为无论你使用什么,它对源代码的变化都非常敏感。如果您将其作为一次性或锻炼来进行,那就可以了。

标签: java regex match regex-group


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    这是对您问题前半部分的回答。

    来自Javadoc

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

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

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

    【讨论】:

      【解决方案3】:

      试试下面的代码:

          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));
          }
      

      希望这会有所帮助。

      【讨论】:

        【解决方案4】:

        你只需要这样做:

        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() 会找到。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-10-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-02-23
          • 2014-12-26
          • 2017-12-22
          相关资源
          最近更新 更多