4

[JSoup 讨论页面建议我在这里问我的问题。]

所以,我不是正则表达式专家,但我想知道我从 jsoup getElementsByAttributeValueMatching() 方法得到的结果。

如果我有一个 html 页面,其中包含以下链接:

<a href="/tweb/tiles/twr/EIDS_AT_20130108T134335/01/">Parent Directory</a>
<a href="1357681618315/">1357681618315/</a>
<a href="1357681649996/">1357681649996/</a>

我查询:

Elements dirs = baseDir.getElementsByAttributeValueMatching("href", Pattern.compile("[0-9]+/"));

希望只得到只有数字的 2 个链接(最后是一个斜线。)

但是,我得到了所有 3 个链接。

我编写了一个快速测试程序来检查 java 的模式匹配器对带有 3 个 href 字符串的正则表达式的响应,并且它只返回两个只有数字的,正如我所期望的:

String a = "/tweb/tiles/twr/EIDS_AT_20130108T134335/01/";
String b = "1357681618315/";
String c = "1357681649996/";

Pattern p = Pattern.compile("[0-9]+/");

System.out.println("a:"+ p.matcher(a).matches());
System.out.println("b:"+ p.matcher(b).matches());
System.out.println("c:"+ p.matcher(c).matches());

返回:a:false b:true c:true

所以,我的问题是,我错过了什么?

谢谢,莱纳斯

4

2 回答 2

5

Jsoup 使用Matcher#find(),而不是Matcher#matches(). 所以,你需要供应^$你自己。

Elements dirs = baseDir.getElementsByAttributeValueMatching(
    "href", Pattern.compile("^[0-9]+/$"));

以下是解释差异的相关 javadoc 摘录(重点是我的)

寻找

...

回报:

true当且仅当输入序列的子序列匹配此匹配器的模式

火柴

...

回报:

true当且仅当整个区域序列与此匹配器的模式匹配

至于为什么 Jsoup 使用find()而不是matches(),这是您必须向其创建者提出的问题。

于 2013-01-14T18:53:49.530 回答
0

当我们在 jsoup 中使用 select 时,您可以使用[attr*=valContaining]和。[attr~=regex]

元素 dirs = baseDir.select([attr~=regex]);

attr----> 属性正则表达式-----> 正则表达式应用于该属性的值

请参阅此处的文档https://jsoup.org/apidocs/org/jsoup/select/Selector.html

于 2017-09-04T06:51:55.613 回答