#java #regex #methods
#java #регулярное выражение #методы
Вопрос:
Я совсем новичок в Java, и я столкнулся с ситуацией, которую не могу решить. У меня есть некоторый html-код, и я пытаюсь запустить регулярное выражение для сохранения всех совпадений в массив. Вот мой код:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
public class RegexMatch{
boolean foundMatch = false;
public String[] arrayResults;
public String[] TestRegularExpression(String sourceCode, String pattern){
try{
Pattern regex = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);
Matcher regexMatcher = regex.matcher(sourceCode);
while (regexMatcher.find()) {
arrayResults[matches] = regexMatcher.group();
matches ;
}
} catch (PatternSyntaxException ex) {
// Exception occurred
}
return arrayResults;
}
}
Я передаю строку, содержащую html-код и шаблон регулярного выражения, чтобы извлечь все мета-теги и сохранить их в массиве. Вот как я создаю экземпляр метода:
RegexMatch regex = new RegexMatch();
regex.TestRegularExpression(sourceCode, "<meta.*?>");
String[] META_TAGS = regex.arrayResults;
Любой намек?
Спасибо!
Комментарии:
1. Почему вы используете регулярные выражения для чего-то, что можно сделать намного проще и надежнее с помощью синтаксического анализатора HTML, такого как Jsoup?
2. Какое сообщение в исключении, которое возникает у вас?
3. @Zasz: Похоже, он игнорирует исключения … то, чего он определенно не должен делать.
Ответ №1:
Во-первых, синтаксический анализ HTML с помощью регулярных выражений — плохая идея. Существуют альтернативы, которые преобразуют HTML в DOM и т. Д. — Вы должны изучить их.
Предполагая, что вы все еще хотите идею «сопоставить несколько результатов», мне кажется, что List<E>
некоторая форма была бы более полезной, поэтому вам не нужно заранее знать размер. Вы также можете создать это в самом методе, вместо того, чтобы иметь состояние. Например:
import java.util.*;
import java.util.regex.*;
public class Test
{
public static void main(String[] args)
throws PatternSyntaxException
{
// Want to get x10 and x5 from this
String text = "x10 y5 x5 xyz";
String pattern = "x\d ";
List<String> matches = getAllMatches(text, pattern);
for (String match : matches) {
System.out.println(match);
}
}
public static List<String> getAllMatches(String text, String pattern)
throws PatternSyntaxException
{
Pattern regex = Pattern.compile(pattern);
List<String> results = new ArrayList<String>();
Matcher regexMatcher = regex.matcher(text);
while (regexMatcher.find()) {
results.add(regexMatcher.group());
}
return results;
}
}
Возможно, что в самом классе есть что-то похожее на это Matcher
, но я не могу сразу это увидеть…
Комментарии:
1. Спасибо вам, ребята, за быстрый поворот. Есть веская причина использовать регулярные выражения. К счастью, весь HTML-код, который собирается получить, — это то, что я бы назвал «под контролем». Я имею в виду, я знаю, что я ожидаю получить. С другой стороны, я не игнорирую исключения, я просто пока не знаю, как с ними обращаться. Этот код выполняется на сервлете на сервере Domino, и я не мог заставить его показывать мне трассировку стека на экране (что было бы фантастически для меня). Единственное сообщение, которое я получаю на консоли Domino, — это «HTTP JVM: java.lang. Исключение NullPointerException: null». =(
2. @DiegoSagrera: вы должны быть в состоянии найти какой-то способ улучшить ведение журнала, но вы также должны иметь возможность тестировать и отлаживать это на локальном сервере, где у вас гораздо больше контроля. Кстати, я все еще скептически отношусь к использованию регулярных выражений здесь…
Ответ №2:
С помощью Jsoup вы могли бы сделать что-то столь же простое, как…
import java.util.ArrayList;
import java.util.List;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class GetMeta {
private static final String META_QUERY = "meta";
public static List<String> parseForMeta(String htmlText) {
Document jsDocument = Jsoup.parse(htmlText);
Elements metaElements = jsDocument.select(META_QUERY);
List<String> metaList = new ArrayList<String>();
for (Element element : metaElements) {
metaList.add(element.toString());
}
return metaList;
}
}
Например:
import java.io.IOException;
import java.net.*;
import java.util.*;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class GetMeta {
private static final String META_QUERY = "meta";
private static final String MAIN_URL = "http://www.yahoo.com";
public static void main(String[] args) {
try {
Scanner scan = new Scanner(new URL(MAIN_URL).openStream());
StringBuilder sb = new StringBuilder();
while (scan.hasNextLine()) {
sb.append(scan.nextLine() "n");
}
List<String> metaList = parseForMeta(sb.toString());
for (String metaStr : metaList) {
System.out.println(metaStr);
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static List<String> parseForMeta(String htmlText) {
Document jsDocument = Jsoup.parse(htmlText);
Elements metaElements = jsDocument.select(META_QUERY);
List<String> metaList = new ArrayList<String>();
for (Element element : metaElements) {
metaList.add(element.toString());
}
return metaList;
}
}