Ich habe diese drei Texte und einen Regexp. (OK, es ist HTML, aber ... bitte, konzentrieren Sie sich nicht darauf !!!!)
<h3 class="pubAdTitleBlock "><a href="stackoverflow.com/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="stackoverflow.com/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>
Dies ist der Regexp
regexp = "<h3[^>]*>(<a[^>]*>)?([^<]+)(</a>)?</h3>";
Ich habe drei 3 Gruppen:
- die Eröffnung
<a>
Tag (wahlweise) - der Text (es ist ein Buchtitel, das ist das Ziel von regexp )
- die Schließung
</a>
Tag (wahlweise)
問題点 : Die zweite Reihe ist übereinstimmend, die dritte ist übereinstimmend. Die erste nicht. Warum?
Passender Code:
pattern = Pattern.compile(regexp);
matcher = pattern.matcher(fullString);
idx = 0;
while (matcher.find()) {
...
}
matcher.find()
überspringt einfach die erste Zeile. Es handelt sich nicht um die erste Zeile der Datei, sondern um die 10. Es ist die erste des Beispiels.
Kann die wörtliche Klammer das Problem sein? Wie kann man die Regexp reparieren?
EDITAR : Ich habe versucht
String regexp = "<h3[^>]*>(.+)</h3>";
Aber auch diese Regexp überspringt die erste Zeile ... Ich kann wirklich nicht verstehen !!!!
EDIT 2:
Ich bin mit einem dubt: kann ein Problem sein, wenn es die akzentuierte Zeichen?
EDIT 3:
Ich versuche, von hier aus Daten zu scannen: http://www.jw.org/it/pubblicazioni/libri/?contentLanguageFilter=it&sortBy=3
Ich habe einen Eingabestrom, dann konvertiere ich mit diesem Code in einen einzelnen String:
// 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 "";
}
Dann wende ich die Regexp an ...