2012-05-14 2 views
0

Я ужасен в Regex и был бы очень признателен за любую помощь в этом вопросе, который, я думаю, будет материалом newb для всех знакомых.regex - соответствие между литерной строкой и кавычкой

Я получаю ответ, как это от REST вызова

{"responseData":{"translatedText":"Ciao mondo"},"responseDetails":"","responseStatus":200,"matches":[{"id":"424913311","segment":"Hello World","translation":"Ciao mondo","quality":"74","reference":"","usage-count":50,"subject":"All","created-by":"","last-updated-by":null,"create-date":"2011-12-29 19:14:22","last-update-date":"2011-12-29 19:14:22","match":1},{"id":"0","segment":"Hello World","translation":"Ciao a tutti","quality":"70","reference":"Machine Translation provided by Google, Microsoft, Worldlingo or the MyMemory customized engine.","usage-count":1,"subject":"All","created-by":"MT!","last-updated-by":null,"create-date":"2012-05-14","last-update-date":"2012-05-14","match":0.85}]} 

Все, что мне нужно, это «Ciao Mondo» между этими предложениями. Я надеялся использовать функцию Split Java, которую я мог бы сделать, но, к сожалению, она не допускает двух отдельных разделителей, так как я мог бы указать текст перед переводом.

Для упрощения, что я застрял с это регулярное выражение, чтобы собрать все, что между ними translatedText «:» и следующий "

Я был бы очень признателен за любую помощь

+4

[Вы задаете вопрос XY.] (Http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) Regex - неправильный инструмент для работы. Вы уверены, что не хотите разбирать JSON? [См. Это] (http://meta.stackexchange.com/a/66378/182647). –

+1

И это [не в первый раз] (http://stackoverflow.com/questions/9832954/regex-issue-scraping-youtube), вы пытались применить регулярные выражения к проблемам, которые лучше решаются с помощью более конкретных инструментов. В соответствии с моим ответом на ваш предыдущий вопрос, пытаясь придумать свой собственный мини-парсер для языка, где уже существуют парсеры *, является проигрышной игрой. Используйте анализатор JSON. –

+0

Ничего себе. Это действительно отлично работало и было очень легко реализовать. Поскольку это был не правильный «ответ», знаете ли вы, как я завершаю вопрос? – CitizenSmif

ответ

3

Вы можете использовать \"translatedText\":\"([^\"]*)\" выражение, чтобы захватить матч .

Выражение означает следующее: find translatedText, за которым следует двоеточие и вводная цитата. Затем сопоставьте каждый символ перед следующей цитатой и зафиксируйте результат в группе захвата .

String s = " {\"responseData\":{\"translatedText\":\"Ciao mondo\"},\"responseDetails\":\"\",\"responseStatus\":200,\"matches\":[{\"id\":\"424913311\",\"segment\":\"Hello World\",\"translation\":\"Ciao mondo\",\"quality\":\"74\",\"reference\":\"\",\"usage-count\":50,\"subject\":\"All\",\"created-by\":\"\",\"last-updated-by\":null,\"create-date\":\"2011-12-29 19:14:22\",\"last-update-date\":\"2011-12-29 19:14:22\",\"match\":1},{\"id\":\"0\",\"segment\":\"Hello World\",\"translation\":\"Ciao a tutti\",\"quality\":\"70\",\"reference\":\"Machine Translation provided by Google, Microsoft, Worldlingo or the MyMemory customized engine.\",\"usage-count\":1,\"subject\":\"All\",\"created-by\":\"MT!\",\"last-updated-by\":null,\"create-date\":\"2012-05-14\",\"last-update-date\":\"2012-05-14\",\"match\":0.85}]}"; 
System.out.println(s); 
Pattern p = Pattern.compile("\"translatedText\":\"([^\"]*)\""); 
Matcher m = p.matcher(s); 
if (!m.find()) return; 
System.out.println(m.group(1)); 

Этот фрагмент prints Ciao mondo.

0

использование упреждением и смотреть-за собрать строки внутри цитаты: (? < = [{}.] \ "). * (= \?")

class Test 
{ 
    public static void main(String[] args) 
    { 
     Scanner scanner = new Scanner(System.in); 
     String in = scanner.nextLine(); 

     Matcher matcher = Pattern.compile("(?<=[,.{}:]\\\").*?(?=\\\")").matcher(in); 

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

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

^.*translatedText":"([^"]*)"},"responseDetails".*$ 

Совпадение группа будет содержать текст Ciao Mondo.

Это предполагает, что translText и responseDetails всегда будут отображаться в позициях, указанных в вашем примере.

+0

Он также предполагает, что «Переведенный текст» будет содержать только '[a-zA-Z \ s]'. Что делать, если переведенный текст '' Santo cielo! ¿Es que una vaca? '? Или, возможно, одно и то же на русском - «Святая корова! Это корова? ' –

+0

Тогда у Хьюстона есть проблема! Мне нравится решение dasblinkenlight. Я пересматриваю мой, чтобы принять все, что не является двойной цитатой. – Pradeep

+0

@ Li-aungYip Это плохой перевод - '' Santo cielo'' обычно переводится как 'Боже мой!' – dasblinkenlight

Смежные вопросы