4

这是我要获取数据的字符串的格式/示例:

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

有什么问题?如果正则表达式已经过测试,并且在相同的代码中,我会搜索更多模式,但我遇到了两个问题(我在这里只向您展示一个)。先感谢您!

_编辑_ _

我发现了问题......如果我检查页面的源代码,它会显示所有内容,但是当我尝试从 Java 中使用它时,它会获得另一个源代码。为什么?因为这个页面需要你的城市,所以它可以显示关于那个的信息。我不知道是否有解决方法来实际访问我想要的信息,但就是这样。

4

2 回答 2

2

您的正则表达式是正确的,但似乎\w不匹配ñ

我将正则表达式更改为

"pelicula/([0-9]*)'>(.*?)</a>"

它似乎与这两种情况都匹配。在这里,我使用了不情愿的*?运算符来防止.*匹配从 first<a>到 last之间的所有字符<\a> 看看`Greedy` 和 `Reluctant` 正则表达式量词有什么区别?解释。

@Bohemian 正确地指出,Pattern.DOTALL如果文本中<a>有换行符,您可能还需要启用该标志

于 2012-11-16T14:49:46.510 回答
1

如果您的输入超过几行(即它包含换行符),您需要打开“点匹配换行符”。

有两种方法可以做到这一点:

在您的正则表达式中使用“点匹配换行符”正则表达式开关(?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);
于 2012-11-16T02:08:26.520 回答