0

您好,我需要在字符串中找到第二次匹配项

我有一个像“

<span class="test">
  example
</span>
<span class="test">
  example1
</span>
<span class="test">
  example2
</span>

我需要从我尝试过的内容中提取示例 1,(?:<span class="test"){2}(.*?)</span>但它不起作用。

请不要说不要将 HTML 解析器与正则表达式一起使用。我知道我别无选择。

4

3 回答 3

1

以下正则表达式:

<span class="test">\s*(.*?)\s*</span>

将产生以下捕获:

        [0] =>   example
        [1] =>   example1
        [2] =>   example2

你可以参考任何你喜欢的。

但是如果由于某种原因您不能引用特定的捕获(我无法想象为什么不引用,所以这是一种学术性的),那么以下将返回第二个:

<span class="test">(?s).*?</span>\s*<span class="test">\s*(.*?)\s*</span>

注意“单行模式”的使用,由(?s). 这意味着.也将匹配换行符。DOTALL在 Java 中,如果您使用该.compile()方法,则可以通过使用该选项来启用。

于 2013-05-07T09:48:29.830 回答
0

试试这个:

(?:<span class="test".*?</span>)\s*<span[^>]*>\s*(.*?)\s*</span>

期望的结果是唯一匹配的组。为此,您需要使用DOTALL标志。

于 2013-05-07T09:50:23.437 回答
0

试试这个:

String text = "<span class=\"test\">  example</span>\n<span class=\"test\">  example1</span>\n<span class=\"test\">  example2</span>";
Matcher m1 = Pattern.compile("<span class=\\\"test\\\">(.*?)<\\/span>").matcher(text);
ArrayList<String> matches = new ArrayList<String>();
while(m1.find()){
   matches.add(m1.group(1).trim());
}
System.out.println(matches.get(1));
于 2013-05-07T09:52:11.433 回答