2016-09-29 76 views
0

我有一個文本,例如的Java的replaceAll有限制

"IssueDetail":"IQR: ON THE FORM YOU MARKED YES TO THE FOLLOWING QUESTION: Anything preventing you from completing the inspection? YOU NEED TO MARK "NO" ON THIS PART. FURTHER DOWN THERE IS A QUESTION THAT STATES : Do you have interior access to complete the inspection? THIS IS WHERE YOU ARE GOING TO CHECK "NO" AND UPLOAD THE PHOTO. PLEASE COMPLETE THIS ON THE FORM AND FOLLOW THE REST OF THE PROMPTS TO COMPLETE THE FULL EXTERIOR INSPECTION. IF YOU HAVE ANY QUESTIONS PLEASE CONTACT YOUR VC. THANK YOU! ","PhotoIssue":true,"FormIssue":true,"SendEmail":true 

在本文中,我需要 「與 \」 替換

在簡單的情況下,它可以做到用

result = string.replaceAll("\"", "\\\""); 

但我有一個限制:

  • 不得在最開始或最末端替換(如果是第一個或最後一個元素);
  • 不得在指令改爲 」:「
  • 不得在指令替換 「」

我可以使用下面的步驟解決這個問題:拆分字符串,替換,連接... 我知道它也可以使用正則表達式 - 更好的方式來解決。

但遺憾的是我不能建立與限制對應的圖案......

在結果我的例子應該是(「NO」 - \ 「否\」):

"IssueDetail":"IQR: ON THE FORM YOU MARKED YES TO THE FOLLOWING QUESTION: Anything preventing you from completing the inspection? YOU NEED TO MARK \"NO\" ON THIS PART. FURTHER DOWN THERE IS A QUESTION THAT STATES : Do you have interior access to complete the inspection? THIS IS WHERE YOU ARE GOING TO CHECK \"NO\" AND UPLOAD THE PHOTO. PLEASE COMPLETE THIS ON THE FORM AND FOLLOW THE REST OF THE PROMPTS TO COMPLETE THE FULL EXTERIOR INSPECTION. IF YOU HAVE ANY QUESTIONS PLEASE CONTACT YOUR VC. THANK YOU! ","PhotoIssue":true,"FormIssue":true,"SendEmail":true 

回答

1

我想你想要的是以下(使用lookarounds):

//    | not preceded by beginning of string or : or , 
//    |  | escaped " 
//    |  | | not followed by : or , or end of string 
test.replaceAll("(?<!^|:|,)\"(?!:|,|$)", "\\\\\"") 

String test = "\"IssueDetail\":\"IQR: ON THE FORM YOU MARKED YES TO THE FOLLOWING QUESTION: " 
+ "Anything preventing you from completing the inspection? YOU NEED TO MARK \"NO\" " 
+ "ON THIS PART. FURTHER DOWN THERE IS A QUESTION THAT STATES : Do you have " 
+ "interior access to complete the inspection? THIS IS WHERE YOU ARE GOING TO " 
+ "CHECK \"NO\" AND UPLOAD THE PHOTO. PLEASE COMPLETE THIS ON THE FORM AND " 
+ "FOLLOW THE REST OF THE PROMPTS TO COMPLETE THE FULL EXTERIOR INSPECTION. " 
+ "IF YOU HAVE ANY QUESTIONS PLEASE CONTACT YOUR VC. THANK YOU! " 
+ "\",\"PhotoIssue\":true,\"FormIssue\":true,\"SendEmail\":true"; 

System.out.println(
    test.replaceAll("(?<!^|:|,)\"(?!:|,|$)", "\\\\\"") 
); 

輸出(加入換行符爲了清楚)

"IssueDetail":"IQR: ON THE FORM YOU MARKED YES TO THE FOLLOWING QUESTION: 
Anything preventing you from completing the inspection? YOU NEED TO MARK \"NO\" 
ON THIS PART. FURTHER DOWN THERE IS A QUESTION THAT STATES : Do you have interior 
access to complete the inspection? THIS IS WHERE YOU ARE GOING TO CHECK \"NO\" 
AND UPLOAD THE PHOTO. PLEASE COMPLETE THIS ON THE FORM AND FOLLOW THE REST OF 
THE PROMPTS TO COMPLETE THE FULL EXTERIOR INSPECTION. IF YOU HAVE ANY QUESTIONS 
PLEASE CONTACT YOUR VC. THANK YOU! ","PhotoIssue":true,"FormIssue":true, 
"SendEmail":true 

,請參閱Java圖案doc page上廁所額外的見解K-變通。

+0

梅娜,你能解釋一下你的表情的部分*?<!^ *怎麼工作? – Sergii

+0

@Sergii這是一個負面的後視。它看起來在實際符號之前('^'代表輸入的開始,'|'OR運算符,':'和','只是文字),在消耗字面量「」之前。 – Mena

0

試試這個:string.replaceAll("(\\w|\\s)(\")(\\w|\\s)", "$1\\\\$2$3");

+0

儘管此代碼可以幫助解決這個問題,它不能解釋_why_和/或_how_它回答了這個問題。提供這種附加背景將顯着提高其長期教育價值。請[編輯]您的答案以添加解釋,包括適用的限制和假設。 –

1

你可以使用負面lookeahed和lookbehind。

public static void main(String[] args) { 
    String s = "\"IssueDetail\":\"IQR: ON THE FORM YOU MARKED YES TO THE FOLLOWING QUESTION: Anything preventing you " 
      + "from completing the inspection? YOU NEED TO MARK \"NO\" ON THIS PART. FURTHER DOWN THERE IS A QUESTION THAT STATES : " 
      + "Do you have interior access to complete the inspection? THIS IS WHERE YOU ARE GOING TO CHECK \"NO\" " 
      + "AND UPLOAD THE PHOTO. PLEASE COMPLETE THIS ON THE FORM AND FOLLOW THE REST OF THE PROMPTS TO COMPLETE " 
      + "THE FULL EXTERIOR INSPECTION. IF YOU HAVE ANY QUESTIONS PLEASE CONTACT YOUR VC. THANK YOU! \",\"PhotoIssue\":" 
      + "true,\"FormIssue\":true,\"SendEmail\":true"; 

    String p = s.replaceAll("(?<![,:])\"(?![,:])", "\\\""); 

    String expected = "\"IssueDetail\":\"IQR: ON THE FORM YOU MARKED YES TO THE FOLLOWING QUESTION: " 
      + "Anything preventing you from completing the inspection? YOU NEED TO MARK \"NO\" ON THIS PART. FURTHER DOWN THERE" 
      + " IS A QUESTION THAT STATES : Do you have interior access to complete the inspection? " 
      + "THIS IS WHERE YOU ARE GOING TO CHECK \"NO\" AND UPLOAD THE PHOTO. " 
      + "PLEASE COMPLETE THIS ON THE FORM AND FOLLOW THE REST OF THE PROMPTS TO COMPLETE THE FULL EXTERIOR INSPECTION." 
      + " IF YOU HAVE ANY QUESTIONS PLEASE CONTACT YOUR VC. THANK YOU! \",\"PhotoIssue\":true,\"FormIssue\":true,\"SendEmail\":true"; 

    System.out.println(p.equals(expected)); 
} 

O/P:

true