#java #regex
#java #регулярное выражение
Вопрос:
Я пытаюсь получить значение атрибута мета-тега «name» исходного кода HTML в одном регулярном выражении. Возможно ли это? Прямо сейчас я запускаю регулярное выражение, чтобы получить все мета-теги:
"<meta.*?>"
Я сохраняю все совпадения в List<String>, а затем запускаю второе регулярное выражение для этих результатов, чтобы получить значение атрибута «name»:
"name=".*?""
Есть ли способ сделать это с помощью одного регулярного выражения? Я просто хочу сохранить атрибут «name» ТОЛЬКО для мета-тегов, игнорируя другие теги HTML.
Спасибо!
Комментарии:
1. Почему бы вам не использовать для этого синтаксический анализатор HTML?
2. Да, Jsoup может легко и просто сделать это в нескольких строках кода.
3. Это хорошо, но любой анализатор, который знает xpath, может легко сделать это за один раз.
Ответ №1:
List<String> matchList = new ArrayList<String>();
try {
Pattern regex = Pattern.compile("(?<=<meta).*?name\s*=\s*"(.*)"");
Matcher regexMatcher = regex.matcher(subjectString);
while (regexMatcher.find()) {
matchList.add(regexMatcher.group(1));
}
} catch (PatternSyntaxException ex) {
// Syntax error in the regular expression
}
Ваш список (MatchList ) в конце должен содержать желаемый результат, который будет значениями всех атрибутов name .
Наконец, как вы увидите во всех сообщениях, связанных с xml / html и регулярными выражениями, нормой является использование синтаксического анализатора вместо регулярного выражения. Однако, если ваша задача настолько проста, вы можете легко выполнить это с помощью регулярного выражения.
Ответ №2:
Jsoup (и другие анализаторы HTML) могут сделать это легко и просто:
public static List<String> parseForMeta(String htmlText) {
Document jsDocument = Jsoup.parse(htmlText);
Elements metaElements = jsDocument.select("meta[name]");
List<String> metaList = new ArrayList<String>();
for (Element element : metaElements) {
metaList.add(element.toString());
}
return metaList;
}
РЕДАКТИРОВАТЬ: но, черт возьми, вы уже знаете это из своего последнего потока !?