2012-02-23 35 views
0

需要找到以下問題的表達式:java的正則表達式爲不願匹配

String given = "{ \"questionID\" :\"4\", \"question\":\"What is your favourite hobby?\",\"answer\" :\"answer 4\"},{ \"questionID\" :\"5\", \"question\" :\"What was the name of the first company you worked at?\",\"answer\" :\"answer 5\"}"; 

我想什麼:"{ \"questionID\" :\"4\", \"question\":\"What is your favourite hobby?\",\"answer\" :\"*******\"},{ \"questionID\" :\"5\", \"question\" :\"What was the name of the first company you worked at?\",\"answer\" :\"******\"}";

我試圖:

String regex = "(.*answer\"\\s:\"){1}(.*)(\"[\\s}]?)"; 
    String rep = "$1*****$3"; 
    System.out.println(test.replaceAll(regex, rep)); 

我得到:

"{ \"questionID\" :\"4\", \"question\":\"What is your favourite hobby?\",\"answer\" :\"answer 4\"},{ \"questionID\" :\"5\", \"question\" :\"What was the name of the first company you worked at?\",\"answer\" :\"******\"}"; 

由於貪婪的行爲,第一組捕捉到兩個「答案」部分,而我希望它在找到足夠的部分後停下來,執行替換,然後繼續往前看。

+0

我不明白這個問題。你有沒有*看過Java'Pattern'類? – 2012-02-23 00:24:03

+1

我現在無法測試,但你可以嘗試'(\「answer \」\\ s *:\\ s * \「)(。*?)(\」)' – ARRG 2012-02-23 00:29:50

+0

我確實是先生,我相信replaceAll會在內部使用Pattern.compile。基本上問題出在我的正則表達式中 - 我需要它來代替「答案」和「}」之間的所有文本,但由於它的貪婪性,它比我想要的要多得多。 IE瀏覽器。在我的「給定」字符串中,我希望字符87到95替換爲星號,字符210到218替換爲星號 - 但此刻只有第二次替換髮生,因爲第一個被認爲是第一組的一部分(由於貪婪行爲)。 – Konstantin 2012-02-23 00:32:08

回答

0

模式

("answer"\s*:\s*")(.*?)(") 

似乎做你想要什麼。下面是Java中的轉義版本:

(\"answer\"\\s*:\\s*\")(.*?)(\") 

的這裏關鍵是使用(.*?)答案,而不是(.*)匹配。後者匹配儘可能多的字符,前者將盡快停止。

如果答案中有雙引號,上述模式將不起作用。下面是一個更復雜的版本,這將使他們:

("answer"\s*:\s*")((.*?)[^\\])?(")

你必須在置換方式使用$4而不是$3

+1

當這個值包含一個轉義的雙引號時,這將無法正常工作:'{「answer」:「\」「}' – 2012-02-23 00:49:00

+0

你是對的......我修正了它(我想) – ARRG 2012-02-23 00:50:44

+0

我想你想用'(?:[^ \\「\ r \ n] | \\ [^ \ r \ n])替換'.''。編輯將不匹配'{「answer」:「\\」}''。 – 2012-02-23 01:16:42

0

對我來說,以下的正則表達式的作品:

regex = "(?<=answer\"\\s:\")(answer.*?)(?=\"})"; 
rep = "*****"; 
replaceALL(regex,rep); 

\"可能因爲我沒有java的測試被錯誤地逃過一劫。

http://regexr.com?303mm

+0

當值包含一個轉義的雙引號時,這將無法正常工作:{「answer」:「\」「}。 – 2012-02-23 00:49:21

+0

'\」answer \「5 \''而不是'\」回答5 \「'? – 2012-02-23 01:13:32