2013-04-24 4 views
1

Что такое правильное регулярное выражение для извлечения resultCount учитывая следующий шаблон (обратите внимание, я не забочусь ни о чем другом в строке):Помощь по простой схеме регулярных выражений

{ 
"resultCount":12, 
"results": [blah blah.. 

Вот регулярное выражение я попробовал. , но нет кубиков (т.е. нет совпадений ..).

.*resultCount":([\d]+),.* 

Язык java; и это имеет значение (оказывается, выражение регулярных выражений отлично работает в ванильном регулярном выражении). Так что я посмотрю, является ли какой-то символ, например, цитатой.

+2

Это не выглядит слишком неправильно, хотя квадратные скобки не нужны. Две вещи: на каком языке вы это используете? Ваш вход выглядит подозрительно, как JSON. Не было бы проще/более надежным/более читаемым использовать парсер JSON? –

+2

Почему бы просто не забыть об этих '. *' (Или ваши регулярные выражения привязаны к началу и концу строки)? В некоторых вариантах регулярного выражения точка может даже не соответствовать этой линии ... – Bergi

+0

@buettner. Да, вы правы в важности языка: это регулярное выражение работает отлично, но не в java. Я не хочу, чтобы в этом контексте был полностью обработан парсером json. – javadba

ответ

1

Я предполагаю, что вы используете функцию String.matches в Java, которая требует, чтобы вся строка была сопоставлена ​​шаблоном (именно поэтому вы включили .* до и после шаблон). Поскольку Берги правильно замечен, ., как правило, не будет соответствовать разрыву строк, поэтому вы не можете получить полное строковое соответствие, не используя DOTALL.

Но это действительно немного взломать. Вы фактически не заинтересованы в сопоставлении всей строки (это то, что вы делаете для проверки). И Java предоставляет второй метод сопоставления шаблонов, который требует немного больше кода, но позволяет выполнять работу должным образом (поиск совпадений подстрок - и несколько их при необходимости). Вот некоторые быстрый пример кода с фиксированной комбинацией (при условии, str ваша входная строка):

Pattern pattern = Pattern.compile("resultCount\":\\s*(\\d+)"); 

Matcher matcher = pattern.matcher(str); 

while (matcher.find()) { 
    System.out.println(matcher.group(1)); 
} 

Оба Pattern и Matcher являются частью java.util.regex. На основе кода on this tutorial page.

Working demo.

Конечно включение \\s* в шаблон до вас, но это, безусловно, то, что может произойти, если вы не генерировать JSON себя, и он не может причинить никакого вреда, так как нет перекрытия с \\d.

+0

Привет, у меня есть оба варианта использования (совпадение и поиск), и я уже использую оба фрагмента кода в своих утилитах регулярных выражений. Но я продолжу и отмечаю ваш ответ как принятый. – javadba