这是我想要获取数据的字符串的格式/示例:
<span style='display:block;margin-bottom:3px;'><a style='margin:4px;color:#B82933;font-size:120%' href='/cartelera/pelicula/18312'>Español </a></span><br><span style='display:block;margin-bottom:3px;'><a style='margin:4px;color:#FBEBC4;font-size:120%' href='/cartelera/pelicula/18313'>Subtitulada </a></span><br> </div>
这是我正在使用的正则表达式:
"pelicula/([0-9]*)'>([\\w\\s]*)</a>"
我在RegexPlanet中测试了这个正则表达式,结果没问题,它给了我预期的结果:
group(1) = 18313
group(2) = Subtitulada
但是当我尝试在Java中实现该正则表达式时,它不会匹配任何东西。这是代码:
Pattern pattern = Pattern.compile("pelicula/([0-9]*)'>([\\w\\s]*)</a>");
Matcher matcher = pattern.matcher(inputLine);
while(matcher.find()){
version = matcher.group(2);
}
}
问题是什么?如果正则表达式已经过测试,并且在相同的代码中我搜索了更多模式,但我遇到了两个问题(我在这里只展示了一个)。提前谢谢!
的 的 _ 修改的 _ _ < / p>
我发现了问题...如果我检查页面的源代码它会显示所有内容,但是当我尝试从Java中使用它时,它会获得另一个源代码。为什么?因为此页面要求您的城市,所以它可以显示有关该城市的信息。我不知道是否有关于实际访问我想要的信息的解决方法,但就是这样。
答案 0 :(得分:2)
您的正则表达式是正确的,但似乎\w
与ñ
不匹配。
我将正则表达式更改为
"pelicula/([0-9]*)'>(.*?)</a>"
它似乎匹配两个事件。
在这里,我使用了不情愿的*?
运算符来阻止.*
匹配首先<a>
到最后<\a>
之间的所有字符
有关说明,请参阅What is the difference between `Greedy` and `Reluctant` regular expression quantifiers?。
@Bohemian指出,如果Pattern.DOTALL
中的文字有换行符,您可能需要启用<a>
标记
答案 1 :(得分:1)
如果你的输入是多行(即它包含换行符),你需要打开“点匹配换行符”。
有两种方法可以做到这一点:
在你的正则表达式中使用“dot matches newline”正则表达式开关(?s)
:
Pattern pattern = Pattern.compile("(?s)pelicula/([0-9]*)'>([\\w\\s]*)</a>");
或在Pattern.DOTALL
的调用中使用Pattern.compile()
标记:
Pattern pattern = Pattern.compile("pelicula/([0-9]*)'>([\\w\\s]*)</a>", Pattern.DOTALL);