Итерация массива и проверка регулярного выражения для каждого значения (Java)

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