Java正则表达式替换双引号内的双引号

时间:2012-07-25 12:11:16

标签: java regex double str-replace

输入字符串为:"outer string "inside a quote" "
输出应为:"outer string inside a quote "

请建议使用任何正则表达式查找内部双引号并使用Java替换为空格。

3 个答案:

答案 0 :(得分:2)

你可以这样试试,没有正则表达式,并且在一次迭代中:

/*
 * I assume that if after quote ther is character like "a then it is
 * beggining of cite. Rest quotes are closing ones.
 */
public static String removeInnerQuotes(String data) {

    StringBuilder sb = new StringBuilder();
    int quoteCounter = 0;
    char[] array = data.toCharArray();
    for (int i = 0; i < array.length; i++) {
        if (array[i] == '"') {
            if (i + 1 < array.length
                    && (
                            (array[i + 1] >= 'a' && array[i + 1] <= 'z') 
                        || 
                            (array[i + 1] >= 'A' && array[i + 1] <= 'Z')
                        )
                ){
                quoteCounter++;
                if (quoteCounter == 1)
                    sb.append('"');
            }
            else{
                quoteCounter--;
                if (quoteCounter == 0)
                    sb.append('"');
            }

        } else
            sb.append(array[i]);
    }
    return sb.toString();
}

public static void main(String[] args) {
    String data = "\"outer string \"inside a quote\" abc\" something outside quote, and again \"outer string \"inside a quote\" def \"";
    System.out.println(removeInnerQuotes(data));
}

输出:

"outer string inside a quote abc" something outside quote, and again "outer string inside a quote def "

答案 1 :(得分:1)

假设外部引号内只有一个嵌套级别且只有一个内引号,则以下内容应该有效:

str.replaceAll("\"(\\b[^\"]+)?\"\\b([^\"]+)\\b\"([^\"]+\\b)?\"","\"$1$2$3\"");

它尝试通过单词边界检测打开与结束引号。要允许外引号和内引号之间的空格(而不是单词),甚至内引号中没有空格,请使用:

str.replaceAll("\"(\\b[^\"]+|\\s+)?\"(\\b[^\"]+\\b)?\"([^\"]+\\b|\\s+)?\"","\"$1$2$3\"");

答案 2 :(得分:0)

我认为对于这种情况,正则表达式解决方案(如果可用)可能稍微有些可以维护。

你能做的就是这样:

String str = "outer string "inside a quote" ";
String newStr = "\"" + str.replaceAll("\"","") + "\";

上面的代码将删除所有引号,并在字符串的开头和结尾添加一个。

编辑:

我已经想出了这个,它有点令人费解,但似乎确实有效:

String str = "sdsadsaasdasdsadas\"sadsad\"the is sparta\"asdsadsa\"sdassa";
String newStr = str.replaceAll("(\".*?)\"(.*?)\"(.*?\")", "$1$2$3");
System.out.println(newStr);

它产生:

sdsadsaasdasdsadas"sadsadthe is spartaasdsadsa"sdassa

上面的正则表达式基本上将文本拆分为3个部分,第一组引号之前的部分,内部引用之间的集合和内部引用之后的部分。然后它重建字符串。

编辑:

我用这段代码从文件中读取字符串(注意本例中的字符串是1个字符串)

Scanner input = new Scanner(new File(filePath));
StringBuilder sb = new StringBuilder();
while (input.hasNextLine())
{
    sb.append(input.nextLine().trim()).append(" ");
}
input.close();
String str = sb.toString().trim();
String newStr = str.replaceAll("(\".*?)\"(.*?)\"(.*?\")", "$1$2$3");
System.out.println(newStr);

它屈服了:

  

“引号内的外部字符串”