Дополнительный поиск регулярных выражений Java в одном процессе?

#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;
   }
  

РЕДАКТИРОВАТЬ: но, черт возьми, вы уже знаете это из своего последнего потока !?