Regex в вопросе Java, несколько совпадений - PullRequest
4 голосов
/ 21 января 2009

Я пытаюсь сопоставить несколько блоков кода стиля CSS в документе HTML. Этот код будет соответствовать первому, но не будет совпадать со вторым. Какой код мне нужно, чтобы соответствовать второй. Могу ли я просто получить список групп, которые находятся в моих скобках «стиля»? Должен ли я вызвать метод 'find' для получения следующего соответствия?

Вот мой шаблон регулярных выражений

^.*(<style type="text/css">)(.*)(</style>).*$

Использование:

final Pattern pattern_css = Pattern.compile(css_pattern_buf.toString(), 
                    Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);

 final Matcher match_css = pattern_css.matcher(text);
        if (match_css.matches() && (match_css.groupCount() >= 3)) {
            System.out.println("Woot ==>" + match_css.groupCount());
            System.out.println(match_css.group(2));
        } else {
            System.out.println("No Match");
        }

Ответы [ 2 ]

14 голосов
/ 21 января 2009

Я пытаюсь сопоставить несколько блоков кода стиля CSS в документе HTML.

Стандартный ответ: не используйте регулярные выражения для разбора HTML. regex не может надежно анализировать HTML, независимо от того, насколько сложным и умным вы делаете свое выражение. Если вы не уверены, что точный формат целевого документа полностью установлен, обработка строк или регулярных выражений недостаточна, и вы должны использовать анализатор HTML.

(<style type="text/css">)(.*)(</style>)

Это жадное выражение. (. *) В середине будет соответствовать столько, сколько возможно. Если у вас есть два блока стиля:

<style type="text/css">1</style> <style type="text/css">2</style>

тогда он будет счастливо совпадать с '1

) совпадать при первой возможности.

Должен ли я вызвать метод 'find' для получения следующего совпадения?

Да, и вы должны были использовать его, чтобы получить первый матч тоже. Обычная идиома:

while (matcher.find()) {
    s= matcher.group(n);
}

Обратите внимание, что стандартная обработка строк (indexOf и т. Д.) Может оказаться для вас более простым подходом, чем регулярное выражение, поскольку вы используете только полностью фиксированные строки. Тем не менее, стандартный ответ по-прежнему применяется.

0 голосов
/ 21 января 2009

Вы можете упростить регулярное выражение следующим образом:

(<style type="text/css">)(.*?)(</style>)

И если вам не нужны группы 1 и 3 (возможно, нет), я бы опустил скобки, оставив только:

<style type="text/css">(.*?)</style>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...