2012-05-14 74 views
0

我在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}]} 

所有我需要這樣的反應是在那些報價之間的「僑盟」。我希望用Java的Split功能,我可以做到這一點,但不幸的是,它不允許兩個單獨的分隔符,因爲我可以在翻譯之前指定文本。

爲了簡化,什麼我堅持用是收集什麼是其間translatedText正規表達式「:」和下一個「

我會任何幫助

+4

[你在問一個XY問題。](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)正則表達式是這個工作的錯誤工具。你確定你不會解析JSON嗎? [見此](http://meta.stackexchange.com/a/66378/182647)。 –

+1

而這[你甚至不是第一次](http://stackoverflow.com/questions/9832954/regex-issue-scraping-youtube)你已經試圖將正則表達式應用到更好的解決問題的更具體的工具。根據我對你之前提出的問題的回答,試圖爲解析器已經存在的語言創建你自己的迷你解析器是一個失敗的遊戲。使用JSON解析器。 –

+0

哇。這實際上工作完美,很容易實現。由於這不是一個適當的「答案」,你知道我如何最終確定這個問題嗎? – CitizenSmif

回答

3

您可以使用\"translatedText\":\"([^\"]*)\"表情捕捉比賽。

表達式的含義如下:查詢引用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".*$ 

匹配組將包含文本僑盟。

這裏假設translateText和responseDetails將總是出現在樣本中指定的位置。

+0

它還假定'Translated Text'只包含'[a-zA-Z \ s]'。如果翻譯文本是'Santo cielo! ¿Es que una vaca?'?或者可能是俄語中的同​​一件事 - 'Святаякорова! Этокорова?' –

+0

那麼休斯頓我們有一個問題!我喜歡dasblinkenlight的解決方案。我正在修改我的接受一切不是雙引號。 – Pradeep

+0

@ Li-aungYip這是一個很差的翻譯 - 'Santo cielo!'通常翻譯爲'Божемой!' – dasblinkenlight

相關問題