Как мне разобрать эту строку с регулярным выражением? - PullRequest
3 голосов
/ 10 ноября 2010

У меня есть строка вроде:

"GOOG",625.00,"-1.95 - -0.31%"

Я использую этот шаблон, и он не соответствует.Я пытаюсь получить ХОРОШО.Что я делаю неправильно?

Pattern pattern = Pattern.compile("^\"([^\"]+)");
Matcher matcher = pattern.matcher(line);

if (matcher.matches()) {
    Log.i(TAG, matcher.group(0));
} else {
    Log.i(TAG, "no match");
}

Ответы [ 4 ]

3 голосов
/ 10 ноября 2010

Проблема в том, что вы не запускаете matcher.find(), поэтому выражение никогда не вычисляется.То, что у вас будет, будет работать нормально, если вы просто измените его на:

if (matcher.find()) {

Хотя кажется, что было бы проще, если бы вы просто использовали метод String.split (или еще лучше, используйте библиотеку для разбора)CSV файлы):

String temp = "\"GOOG\",625.00,\"-1.95 - -0.31%\"";
String[] parts = temp.split(",");
String symbol = temp[0].replaceAll("\"", "");
1 голос
/ 10 ноября 2010

Метод 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(), который автоматически привязывает совпадение к началу строки, но не к концу, но никто никогда не использует его.)

0 голосов
/ 10 ноября 2010

Попробуйте это регулярное выражение:

^"(?<text>[^"]+?)"

Я думаю, что вы пропустили второй "(тот, что после GOOG")

РЕДАКТИРОВАТЬ:

Pattern pattern = Pattern.compile("^\"([^\"]+)\"");
0 голосов
/ 10 ноября 2010

сначала нужно вызвать matcher.find ()

String temp = "\"GOOG\",625.00,\"-1.95 - -0.31%\"";
Pattern pattern = Pattern.compile("\"[a-zA-Z]*\"");
Matcher matcher = pattern.matcher(temp);

if(matcher.find()){
    Log.i(TAG, matcher.group(0).split("\"")[1]);  
} else {  
    Log.i(TAG, "no match");  
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...