Метод Java matches()
ожидает, что регулярное выражение будет соответствовать всей строке, как если бы оно было привязано на обоих концах ^
и $
(или \A
и \z
). Всякий раз, когда вы используете matches()
с регулярным выражением, которое соответствует только части строки, вам нужно «дополнить» регулярное выражение с помощью .*
, например, так:
Pattern pattern = Pattern.compile("\"([^\"]+).*");
Matcher matcher = pattern.matcher(line);
if (matcher.matches()) {
Log.i(TAG, matcher.group(1)); // not group(0)!
} else {
Log.i(TAG, "no match");
}
^
в начале регулярного выражения не принесло никакого вреда, я просто удалил его, чтобы показать, что в этом нет необходимости. Обратите внимание, что я также изменил ваш group(0)
на group(1)
- это была еще одна ошибка в вашем коде. group(0)
- это полное совпадение, тогда как group(1)
относится только к той части, которая была найдена в первом наборе скобок.
У вас также есть возможность использовать find()
, например, так:
Pattern pattern = Pattern.compile("\"([^\"]+)");
Matcher matcher = pattern.matcher(line);
if (matcher.find()) {
Log.i(TAG, matcher.group(1));
} else {
Log.i(TAG, "no match");
}
Это соответствует первому экземпляру кавычки, за которым следуют один или несколько символов, кроме кавычек (которые записаны в группе # 1). Это будет соответствовать где угодно; если вы хотите, чтобы он совпадал только в самом начале строки, вы должны использовать якорь ^
, как он был в исходном регулярном выражении: "^\"([^\"]+)"
(есть также метод lookingAt()
, который автоматически привязывает совпадение к началу строки, но не к концу, но никто никогда не использует его.)