Java:用不同的空格字符替换String中的空格?

时间:2016-01-07 18:34:58

标签: java string

我有一个庞大的文本文件,我必须手动解析。除了迭代它之外别无他法。

我抓住文件中的每一行和.split(“”)来获取各个组件 - 一些是int数组,另一些是char数组,还有一些是实际的文本字符串。

文本字符串让我头疼,因为有时他们在那里有空间。

示例行类似于:

String strLine = "Identifier {2 4 \"#0# == \\\"This String\\\"\" 12 21 6}

当我执行以下操作时:

String[] strParts = strLine.split(" ");

结果输出是String数组,其String值为:

Identifier,{2,4,"#0#,==,\"This,String\"",12,21,6}

我需要输出:

Identifier,{2,4,"#0# == \"This String\"",12,21,6}

所以我在思考是否有一个不同的空格字符,我可以在执行split()之前将其应用于引号内的String。

有人知道吗?

我也考虑过潜入RegEx,但是我还没有使用RegEx足以能够正确地在分割周围形成逻辑 - 除非空间位于第一个和最后一个引号之间,否则在空间上分割“。

THX。

[更新]

我在此处添加此内容,因为回复中的代码格式不是最佳的。

String strLine = "Identifier {2 4 \"#0# == \\\"This String\\\"\" 12 21 6}";

String delim = "§"; //use the Section Sign as a delimeter

    StringBuilder sb = new StringBuilder();
    //first part
    sb.append(new String(strLine.substring(0,strLine.indexOf("\""))));

    //middle part
    sb.append(new String(strLine.substring(strLine.indexOf("\""),strLine.lastIndexOf("\""))).replace(" ", delim));

    //last part
    sb.append(new String(strLine.substring(strLine.lastIndexOf("\""))));

    //make array
    String[] parts = sb.toString().split(" ");

我稍后需要更换那些分隔符,但至少它会完成我现在需要的那些。

感谢大家的建议,这是他们的组合,最终为我解决了这个问题。

2 个答案:

答案 0 :(得分:1)

您实际上不需要用空格替换字符串空格。尝试一些相当独特的东西:'_!_!'

首先查找替换字符串以验证它不在文件中,然后进行替换。

然后做正常的分裂。

最后,将替换字符串替换为成品中的正常空格。

答案 1 :(得分:1)

不完全优雅,但认为它能完成这项工作:

private static String[] mySplit(String src)
{
    int firstIdx = src.indexOf('"');
    int lastIdx = src.lastIndexOf('"');
    if ( firstIdx == lastIdx )
        return src.split(" ");
    if ( src.charAt(lastIdx+1) == ' ' )
        lastIdx++;
    // first part
    String[] firstPart = src.substring(0, firstIdx-1).split(" ");
    String[] lastPart = src.substring(lastIdx+1).split(" ");

    String[] res = new String[firstPart.length+1+lastPart.length];
    System.arraycopy(firstPart,0,res,0, firstPart.length );
    res[firstPart.length] = src.substring(src.indexOf('"'), src.lastIndexOf('"'));
    System.arraycopy(lastPart,0,res,firstPart.length+1, lastPart.length );
    return res;
}