我有这三个文本和一个正则表达式。 (好吧,这是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>";
我有三组:
<a>
代码(可选)</a>
代码(可选)问题:第二行匹配,第三行匹配。第一个没有。为什么?
匹配代码:
pattern = Pattern.compile(regexp);
matcher = pattern.matcher(fullString);
idx = 0;
while (matcher.find()) {
...
}
matcher.find()
只是跳过第一行。这不是文件的第一行,它是第10行。这是第一个例子。
可以是字面括号的问题吗?如何修复正则表达式?
编辑:我试过
String regexp = "<h3[^>]*>(.+)</h3>";
但是这个正则表达式跳过第一行......我真的无法理解!!!!
编辑2:
我有一个dubt:如果有重音字符可能会有问题吗?
编辑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 "";
}
然后我正在使用正则表达式...
答案 0 :(得分: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。
(我知道使用正则表达式解析HTML的亵渎,但因为OP想要它......) 您忘了提到解析的HTML包含{{1>}内的制表和新行标记等空格。试试这种方式:
<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 :(得分:2)
不要使用Parser或RegExp。试试Jerry。喜欢(未经测试):
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友好的查询语言。由于非外部要求,请尝试Trying to parse links in an HTML directory listing using Java
(我的回答来自:How do you parse links from html using Java?)
编辑:尝试
<h3.*?>(<a.*)?+(.*?)(</a>)?</h3>
并获得组(2)
编辑2:仅针对书名尝试:
(.*>)?([^<]+?)<.*
编辑3:你的正则表达式
<h3[^>]*>(<a[^>]*>)?([^<]+)(</a>)?</h3>
看起来适合我。