Вопрос о Java регулярное выражение - PullRequest
3 голосов
/ 22 апреля 2009

Я получаю строку из списка массивов:

array.get(0).toString()

дает название = "блабла"

Я хочу строку блабла, поэтому я пытаюсь это:

Pattern p = Pattern.compile("(\".*\")");
Matcher m = p.matcher(array.get(0).toString());
System.out.println("Title : " + m.group(0));

Не работает: java.lang.IllegalStateException: No match found

Я тоже пытаюсь:

Pattern p = Pattern.compile("\".*\"");
Pattern p = Pattern.compile("\".*\"");  
Pattern p = Pattern.compile("\\\".*\\\"");

Ничто не соответствует в моей программе, но ВСЕ шаблоны работают на http://www.fileformat.info/tool/regex.htm

Есть идеи? Заранее спасибо.

Ответы [ 3 ]

8 голосов
/ 22 апреля 2009

Пара баллов:

Javadoc для Matcher # group сообщает:

IllegalStateException - Если совпадение еще не было предпринято, или если предыдущая операция сопоставления не удалась

То есть перед использованием группы необходимо сначала использовать m.matches (для сопоставления всей последовательности) или m.find (для сопоставления подпоследовательности).

Во-вторых, вы на самом деле хотите m.group(1), так как m.group(0) - это весь шаблон.

На самом деле, это не так важно, поскольку рассматриваемое регулярное выражение начинается и заканчивается круглыми скобками, так что группа (0) - это та же строка, что и группа (1), но было бы важно, чтобы ваше регулярное выражение выглядело как : "TITLE = (\".*\")"

Пример кода:

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.junit.Test;

@SuppressWarnings("serial")
public class MatcherTest {

    @Test(expected = IllegalStateException.class)
    public void testIllegalState() {
        List<String> array = new ArrayList<String>() {{ add("Title: \"blah\""); }};
        Pattern p = Pattern.compile("(\".*\")");
        Matcher m = p.matcher(array.get(0).toString());
        System.out.println("Title : " + m.group(0));
    }

    @Test
    public void testLegal() {
        List<String> array = new ArrayList<String>() {{ add("Title: \"blah\""); }};
        Pattern p = Pattern.compile("(\".*\")");
        Matcher m = p.matcher(array.get(0).toString());
        if (m.find()) {
            System.out.println("Title : " + m.group(1));
        }
    }
}
6 голосов
/ 22 апреля 2009

Сначала необходимо вызвать find() или matches() в экземпляре Matcher: они фактически выполняют регулярное выражение и возвращают, соответствует оно или нет. И только тогда, когда это совпадение, вы можете вызывать методы для получения групп совпадений.

0 голосов
/ 22 апреля 2009

Вы включаете двойные кавычки (") в строку?

Все ваши регулярные выражения "экранированы" и будут совпадать, только если строка в списке содержит символы двойной кавычки.

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