有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!


共 (3) 个答案

  1. # 1 楼答案

    我认为在这种情况下,regex解决方案(如果可用)可能会稍微复杂一些,以便维护

    你能做的就是做这样的事情:

    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);
    

    它产生了:

    "outer string inside a quote "

  2. # 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 "

  3. # 3 楼答案

    假设只有一个嵌套级别,并且在外部引号中只有一个内部引号,那么以下操作应该可以工作:

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

    它试图通过单词边界来检测开引号和闭引号。要允许外引号和内引号(而不是单词)之间存在空格,甚至内引号中没有空格,请使用以下命令:

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