Regex Работает над тестовой программой, но не над WebSprinx crwaler
Вот мой код для соответствия Regex, который работал для веб-страницы:
public class RegexTestHarness {
public static void main(String[] args) {
File aFile = new File("/home/darshan/Desktop/test.txt");
FileInputStream inFile = null;
try {
inFile = new FileInputStream(aFile);
} catch (FileNotFoundException e) {
e.printStackTrace(System.err);
System.exit(1);
}
BufferedInputStream in = new BufferedInputStream(inFile);
DataInputStream data = new DataInputStream(in);
String string = new String();
try {
while (data.read() != -1) {
string += data.readLine();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Pattern pattern = Pattern
.compile("<div class=\"rest_title\">.*?<h1>(.*?)</h1>");
Matcher matcher = pattern.matcher(string);
boolean found = false;
while (matcher.find()) {
System.out.println("Name: " + matcher.group(1) );
found = true;
}
if(!found){
System.out.println("Pattern Not found");
}
}
}
Но тот же код не работает с кодом crwaler, для которого я тестирую регулярное выражение, мой код на сканере:(я использую Websphinx)
// Our own Crawler class extends the WebSphinx Crawler
public class MyCrawler extends Crawler {
MyCrawler() {
super(); // Do what the parent crawler would do
}
// We could choose not to visit a link based on certain circumstances
// For now we always visit the link
public boolean shouldVisit(Link l) {
// String host = l.getHost();
return false; // always visit a link
}
// What to do when we visit the page
public void visit(Page page) {
System.out.println("Visiting: " + page.getTitle());
String content = page.getContent();
System.out.println(content);
Pattern pattern = Pattern.compile("<div class=\"rest_title\">.*?<h1>(.*?)</h1>");
Matcher matcher = pattern.matcher(content);
boolean found = false;
while (matcher.find()) {
System.out.println("Name: " + matcher.group(1) );
found = true;
}
if(!found){
System.out.println("Pattern Not found");
}
}
}
Это мой код для запуска сканера:
public class WebSphinxTest {
public static void main(String[] args) throws MalformedURLException, InterruptedException {
System.out.println("Testing Websphinx. . .");
// Make an instance of own our crawler
Crawler crawler = new MyCrawler();
// Create a "Link" object and set it as the crawler's root
Link link = new Link("http://justeat.in/restaurant/spices/5633/indian-tandoor-chinese-and-seafood/sarjapur-road/bangalore");
crawler.setRoot(link);
// Start running the crawler!
System.out.println("Starting crawler. . .");
crawler.run(); // Blocking function, could implement a thread, etc.
}
}
Небольшая деталь о коде сканера. shouldvisit(Link link)
Фильтры, чтобы посетить ссылку или нет. visit(Page page)
решает, что делать, когда мы получим страницу.
В приведенном выше примере test.txt и content содержат одну и ту же строку
1 ответ
В вашем RegexTestHarness
вы читаете строки из файла и объединяете строки без разрывов строк, после чего выполняете сопоставление (readLine()
возвращает содержимое строки без разрывов строки!).
Так что на входе вашего MyCrawler
класс, вероятно, есть символы разрыва строки на входе. И так как регулярное выражение мета-символ .
по умолчанию не соответствует символу разрыва строки, он не работает в MyCrawler
,
Чтобы исправить это, добавьте (?s)
из всех ваших шаблонов, которые содержат .
метасимвол Так:
Pattern.compile("<div class=\"rest_title\">.*?<h1>(.*?)</h1>")
станет:
Pattern.compile("(?s)<div class=\"rest_title\">.*?<h1>(.*?)</h1>")
Флаг DOT-ALL, (?s)
, вызовет .
соответствовать любому символу, включая символы разрыва строки.