2

我有这三个文本和一个正则表达式。(好吧,它是 HTML,但是......请不要专注于它!!!!)

<h3 class="pubAdTitleBlock "><a href="/it/pubblicazioni/libri/Che-speranza-cè-per-i-morti/1101987030/" title="Che speranza c’è per i morti?">Che speranza c’è per i morti? (volantino N. 16)</a></h3>

<h3 class="pubAdTitleBlock "><a href="/it/pubblicazioni/libri/cosa-insegna-la-bibbia/È-questo-che-Dio-voleva/" title="È questo che Dio voleva?">Cosa insegna realmente la Bibbia?</a></h3>

<h3 class="pubAdTitleBlock">Cantiamo a Geova</h3>

这是正则表达式

regexp = "<h3[^>]*>(<a[^>]*>)?([^<]+)(</a>)?</h3>";

我有三个 3 组:

  • 开始<a>标签(可选)
  • 文本(这是书名,是 regexp 的目标
  • 结束</a>标签(可选)

问题:第二行匹配,第三行匹配。第一个没有。为什么 ?

匹配代码:

pattern = Pattern.compile(regexp);
matcher = pattern.matcher(fullString);
idx = 0;
while (matcher.find()) {
  ...
}

matcher.find()只是跳过第一行。这不是文件的第一行,而是第 10 行。这是第一个例子。

可以是字面括号的问题吗?如何修复正则表达式?

编辑:我试过

String regexp = "<h3[^>]*>(.+)</h3>";

但是这个正则表达式也跳过了第一行......我真的无法理解!!!!

编辑2:

我有一个问题:如果有重音字符会是个问题吗?

编辑 3:

我正在尝试从这里进行数据抓取:http ://www.jw.org/it/pubblicazioni/libri/?contentLanguageFilter=it&sortBy=3

我有一个输入流,然后我使用以下代码转换为单个字符串:

 // copied from http://stackoverflow.com/questions/309424/read-convert-an-inputstream-to-a-string
public static String convertStreamToString(InputStream is) {
    try {
        return new java.util.Scanner(is, "UTF-8").useDelimiter("\\A").next();
    } catch (java.util.NoSuchElementException e) {
        return "";
    }

然后我正在应用正则表达式...

4

2 回答 2

3

不确定,但也许这就是你要找的

String data = "<h3 class=\"pubAdTitleBlock \"><a href=\"/it/pubblicazioni/libri/Che-speranza-cè-per-i-morti/1101987030/\" title=\"Che speranza c’è per i morti?\">Che speranza c’è per i morti? (volantino N. 16)</a></h3>"
        + "<h3 class=\"pubAdTitleBlock \"><a href=\"/it/pubblicazioni/libri/cosa-insegna-la-bibbia/È-questo-che-Dio-voleva/\" title=\"È questo che Dio voleva?\">Cosa insegna realmente la Bibbia?</a></h3>"
        + "<h3 class=\"pubAdTitleBlock\">Cantiamo a Geova</h3>";

Pattern pattern = Pattern
        .compile("<h3[^>]*>(?:<a[^>]*>)?([^<]+)(?:</a>)?</h3>");
Matcher matcher = pattern.matcher(data);
while (matcher.find()) 
    System.out.println(matcher.group(1));

输出:

Che speranza c’è per i morti? (volantino N. 16)
Cosa insegna realmente la Bibbia?
Cantiamo a Geova

小解释:

像这样的组(?:someregex)不会被正则表达式机制计算在内。由于在(?:a)(b)(?:c)(d)(b)中将被索引为 1 和(d)2。

编辑1

(我知道使用正则表达式解析 HTML 是亵渎神明,但既然 OP 想要它......)
你忘了提到解析的 HTML 包含空格,如制表符和新行标记<h3 >。试试这种方式:

String data = convertStreamToString(new URL(
        "http://www.jw.org/it/pubblicazioni/libri/?contentLanguageFilter=it&sortBy=3")
        .openStream());

Pattern pattern = Pattern
        .compile("<h3[^>]*>\\s*(?:<a[^>]*>)?([^<]+)(?:</a>)\\s*?</h3>");
Matcher matcher = pattern.matcher(data);
int counter=0;
while (matcher.find())
    System.out.println(++counter +")"+matcher.group(1));

输出:

1)Accostiamoci a Geova
2)Accostiamoci a Geova — caratteri grandi
....
11)Cosa insegna realmente la Bibbia?
12)Cosa insegna realmente la Bibbia? — caratteri grandi
于 2012-10-28T14:52:30.090 回答
2

不要使用 Parser 或 RegExp。试试杰瑞。喜欢(未测试):

Jerry doc = jerry(html);
doc.$("a").each(new JerryFunction() {
    public boolean onNode(Jerry $this, int index) {
        String href = $this.attr("href");
        System.out.println(href);
    }
}

或任何对 html 友好的查询语言。由于非外部要求尝试尝试使用 Java 解析 HTML 目录列表中的链接

(复制粘贴我的答案:How do you parse links from html using Java?

编辑:试试

<h3.*?>(<a.*)?+(.*?)(</a>)?</h3>

并获得组(2)

编辑2:只是为了书名尝试:

(.*>)?([^<]+?)<.*

编辑 3:你的正则表达式

<h3[^>]*>(<a[^>]*>)?([^<]+)(</a>)?</h3>

看起来为我工作。

于 2012-10-28T14:01:42.933 回答