2012-05-14 31 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の分割機能を期待していたが残念ながら、私は翻訳の前にテキストを指定することができるように2つの区切り文字を許可していません。簡単にするために

、私はとこだわっていることは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\":\"([^\"]*)\"表現を使用することができます。

表現の意味は次のとおりです。引用符は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

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

一致するグループは、テキストチャオのモンドが含まれています -

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がサンプルで指定された位置に常に存在することを前提としています。

+0

また、「翻訳されたテキスト」には「[a-zA-Z \ s]」しか含まれていないと仮定しています。翻訳されたテキストが '¡ ¿ESque una vaca? '?あるいはおそらくロシア語で同じことをする - 'Святаякорова! Этокорова? ' –

+0

それからヒューストンには問題があります!私はdasblinkenlightのソリューションが好きです。私は二重引用符ではないすべてを受け入れるように私の見直しを行っています。 – Pradeep

+0

@ Li-aungYipこれは貧しい翻訳です - 「Santo cielo!」は一般に「Божемой!」と翻訳されます。 – dasblinkenlight