2016-09-29 72 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