2016-11-21 2 views
-5

Я пытаюсь извлечь строку из объекта json с помощью регулярных выражений в java.Явное регулярное выражение Java не соответствует

Строка выглядит следующим образом:

{"key":"value"} 

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

public String extractVal(String dataRaw) { 
    Pattern p = Pattern.compile(":\"(.+\b)"); 
    Matcher m = p.matcher(dataRaw); //dataRaw is string from above^ 
    if (m.matches()) { 
     return m.group(1); 
    } 
    return null; 
} 

Это всегда просто возвращает нуль. Что я сделал не так?
Заранее спасибо

+4

Почему не просто использовать jsonparser или что-то –

+1

'Мне нужно извлечь строку из объекта json с помощью регулярных выражений в java' ... нет, вы этого не сделаете, вместо этого используйте парсер JSON. –

+0

Я знаю, что такое парсер JSON, это не то, что я спросил. – Plays2

ответ

3

Есть две проблемы с вашим кодом

  1. \b должен быть \\b

  2. Вы должны использовать find(), а не matches(). Первый выполнит поиск по заданной строке и остановится, когда найдет подстроку, которая соответствует регулярному выражению. Второй будет выполнять поиск по всей строке. Поскольку предоставленное регулярное выражение не соответствует полной строке, matches() не работает.

Просто исправьте код в этих двух точках, тогда он будет работать. Протестировал себя.

0

Найдено ответ, используя text2re.com

public String extractVal(String dataRaw) { 
    String re1=".*?"; // Non-greedy match on filler 
    String re2="(?:[a-z][a-z]+)"; // Uninteresting: word 
    String re3=".*?"; // Non-greedy match on filler 
    String re4="((?:[a-z][a-z]+))"; // Word 1 
    Pattern patt = Pattern.compile(re1+re2+re3+re4,Pattern.CASE_INSENSITIVE | Pattern.DOTALL); 
    Matcher matc = patt.matcher(dataRaw); 
    if (matc.find()) { 
     return matc.group(1); 
    } 
    return null; 
} 

Все еще не уверены, что я облажался, хотя.

EDIT: лучшее решение:

public String extractVal(String dataRaw) { 
    String test = ".+:\"(.+)\""; 
    Pattern patt = Pattern.compile(test,Pattern.CASE_INSENSITIVE | Pattern.DOTALL); 
    Matcher matc = patt.matcher(dataRaw); 
    if (matc.find()) { 
     return matc.group(1); 
    } 
    return null; 
} 
Смежные вопросы