您好我需要在字符串
中找到第二次匹配我有一个像“
这样的字符串<span class="test">
example
</span>
<span class="test">
example1
</span>
<span class="test">
example2
</span>
我需要从我尝试(?:<span class="test"){2}(.*?)</span>
的内容中提取示例1,但它无效。
请不要说不使用带有正则表达式的HTML解析器。我知道我别无选择。
答案 0 :(得分: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)
指定的“单行模式”的使用。这意味着.
也会匹配换行符。在Java中,如果您使用DOTALL
方法,可以使用.compile()
选项启用此功能。
答案 1 :(得分:0)
试试这个:
(?:<span class="test".*?</span>)\s*<span[^>]*>\s*(.*?)\s*</span>
所需的结果是唯一匹配的组。为此,您需要使用DOTALL
标志。
答案 2 :(得分: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));
答案 3 :(得分:-1)
你的正则表达式应如下所示:
<span class="test">example([0-9]*)</span>
然后你可以用p = Pattern.compile( regex )
编译一个模式,并获得一个m = p.matcher( str )
的匹配器。
通过调用m.find()
,匹配器将找到下一个模式。 m.group( 1 )
会在示例后面给出数字。
要获得第二次出现,请两次调用m.find()
并致电m.group( 1 )
。