如何根据关键字/模式将一行文本拆分为多行?

时间:2015-08-25 14:06:48

标签: java stringbuffer

我有一个StringBuffer,它包含过去来自文件的多行,所有这些都是基于较大行的模式合并在一起进行比较。在进行了更改之后,我基本上需要撤消将这些行合并在一起以重新写入新的StringBuffer来重新写入原来的文件。

例如,该文件包含这样的一行(全部在一行上):

'macro NDD89 Start;Load; shortDescription; macro(continued) stepone;steptwo,do stuff macro(continued) stepthree;more steps; do stuff macro(continued) finalstep'

我需要将该行重写为多行(在有字符串“macro(continue)”的地方分割):

macro NDD89 Start;Load; shortDescription;
macro(continued) stepone;steptwo,do stuff
macro(continued) stepthree;more steps; do stuff
macro(continued) finalstep'

如果有帮助,这是我的代码片段,它将原始文件放在多行中的第一部分,并将它们组合成组并写入新文件:

    StringBuffer sb = new StringBuffer();
    Buffer = new FileReader(C:/original.txt);
    BufferedReader User_File = new BufferedReader(Buffer);
    String Line_of_Text;
    while((Line_of_Text = User_File.readLine()) != null){
        if(Line_of_Text.startsWith("macro ")){
            sb.append("\n"+Line_of_Text);
        }else if(Line_of_Text.startsWith("macro(continued)")){
            sb.append(Line_of_Text);
        }else{
            sb.append(Line_of_Text+"\n");
        }
    }
    BufferedWriter OutFile = new BufferedWriter(new FileWriter("C:/newFile.txt"));
    OutFile.write(sb.toString());
    OutFile.flush();
    OutFile.close();

我一直坚持这样做的方式,任何建议/想法?

5 个答案:

答案 0 :(得分:0)

我希望String类中的split()和contains()方法可以帮助你。

参考:How to split a string in Java

答案 1 :(得分:0)

问题是你有一个没有行的大字符串。您可以输入if(Line_of_Text.startsWith("macro ")){来测试行System.out.println(Line_of_Text);上方的内容。你可以看到出了什么问题。

我将您的附加代码更改为:

String Line_of_Text = null;
while ((Line_of_Text = User_File.readLine()) != null) {
    Line_of_Text = User_File.readLine();
    String[] splitted = Line_of_Text.split("macro ");
    for (String part : splitted) {
        sb.append(part+"\n");
    }
}

这利用.split()方法将String拆分为String数组。您可以使用该数组中的项目进行追加。

编辑:我发现你有多个分隔符。 .split()采用正则表达式分隔符,因此您可以尝试:Line_of_Text.split("macro|macro\\(continued\\)");

答案 2 :(得分:0)

您可以对给定令牌使用String#split来分割String

示例

String test = "'macro NDD89 Start;Load; shortDescription; macro(continued) stepone;steptwo,do stuff macro(continued) stepthree;more steps; do stuff macro(continued) finalstep'";
//                       // splits into String array, by
//                       //     | followed by...
//                       //     |  | literal text
//                       //     |  |   | double-escape on parenthesis, as
//                       //     |  |   | this is a regex pattern
String[] splitted = test.split("(?=macro\\(continued\\))");
System.out.println("Raw:\r\n");
// prints the raw array (hard to read, as inline)
System.out.println(Arrays.toString(splitted)); 
// creates a list from the array and print each element one per line, trimmed
List<String> splittedList = Arrays.asList(splitted);
System.out.println("\r\nNice:\r\n");
for (String s: splittedList) {
    System.out.println(s.trim());
}

<强>输出

Raw:

['macro NDD89 Start;Load; shortDescription; , macro(continued) stepone;steptwo,do stuff , macro(continued) stepthree;more steps; do stuff , macro(continued) finalstep']

Nice:

'macro NDD89 Start;Load; shortDescription;
macro(continued) stepone;steptwo,do stuff
macro(continued) stepthree;more steps; do stuff
macro(continued) finalstep'

答案 3 :(得分:0)

最简单的解决方案!

String x =oneLine.replace(" macro", "\nmacro");

答案 4 :(得分:0)

快速修复QuakCore的答案。

String breaker = "macro(continued)";
String x =oneLine.replace(" "+breaker, "\n"+breaker);