无法使用Java拆分特定类型的字符串

时间:2018-02-23 16:32:33

标签: java string split

我在Java工作。我有一个参数列表存储在一个字符串中,该字符串来自excel。我想只在每个新行的连字符处拆分它。这个字符串存储在每个excel单元格中,我试图使用Apache poi提取它。格式如下:

}

我想要什么

看起来像这样的数组或arraylist

String text =
        "- I am string one\n" +
        "-I am string two\n" +
        "- I am string-three\n" +
        "with new line\n" +
        "-I am string-four\n" +
        "- I am string five";

我尝试过什么

我尝试使用这样的分割函数:

[I am string one, 
I am string two,
I am string-three with new line,
I am string-four,
I am string five]

但我得到的输出不是我想要的

我的O / P

String[] newline_split = text.split("-");

我可能需要稍微调整分割功能,但不能理解如何,因为字符串中有很多连字符和新行。

P.S。

如果我尝试仅在新行中进行拆分,则行[, I am string one, I am string two, I am string, // wrong three // wrong with new line, // wrong I am string, // wrong! four, // wrong! I am string five] 会分成两部分,这也是不正确的。

修改

在您不假思索地进行downvote之前,请知道字符串中的这些数据格式不正确,就像上面显示的那样。它来自我收到的excel文件。我正在尝试使用apache poi以字符串的形式从每个excel单元格中提取所有内容。

我故意试图保持客户给我的格式。对于那些对- I am string-three \n with new line内部的描述感到困惑的人,我已经改变了,因为我不能在这里发布内容,因为它违反了我工作场所的隐私。

3 个答案:

答案 0 :(得分:1)

我会这样做:

import java.util.*;

public class MyClass {
    public static void main(String args[]) {
        String A = "- I am string one \n" +
        "    -I am string two\n" +
        "    - I am string-three \n" +
        "    with new line\n" +
        "    -I am string-four\n" +
        "- I am string five";

        String[] s2 = A.split("\r?\n");
        List<String> lines = new ArrayList<String>();
        String line = "";
        for (int i = 0; i < s2.length; i++) {
            String ss = s2[i].trim();
            if (i == 0) { // first line MUST start with "-"
                line = ss.substring(1).trim();
            } else if (ss.startsWith("-")) {
                lines.add(line);
                ss = ss.substring(1).trim();
                line = ss;
            } else {
                line = line + " " + ss;
            }
        }
        lines.add(line);

        System.out.println(lines.toString());
    }
}

我希望它有所帮助。

一点解释:

我将逐行处理,修剪每一个。 如果它以' - '开头,则表示前一行的结尾,因此我将其包含在列表中。如果没有,我会与前一行连接。

答案 1 :(得分:1)

你可以

  1. 删除行分隔符(用空格替换)如果它们后面没有-(在下一行):.replaceAll("\\R(?!-)", " ")应该做的伎俩
    • \R(在字符串文字中写为"\\R",因为Java 8可用于表示line separators
    • (?!...)negative-look-ahead mechanism - 确保在使用它之后没有-(不会在匹配中包含它,因此我们不会删除潜在的-与之匹配的商品)
  2. 然后删除放置在每行开头的-(还允许包含跟随的空格以修剪字符串的开头)。换句话说,替换放置-

    • 行分隔符后:可以用"\\R"
    • 表示 字符串开头后
    • :可以用^
    • 表示

    这应该可以解决问题:.replaceAll("(?<=\\R|^)-\\s*","")

  3. 拆分剩余的行separtors:.split("\\R")
  4. 演示:

    String text =
            "- I am string one\n" +
            "-I am string two\n" +
            "- I am string-three\n" +
            "with new line\n" +
            "-I am string-four\n" +
            "- I am string five";
    
    String[] split = text.replaceAll("\\R(?!-)", " ") 
                         .replaceAll("(?<=\\R|^)-\\s*","") 
                         .split("\\R");
    for (String s: split){
        System.out.println("'"+s+"'");
    }
    

    输出(用'包围以显示结果的开始和结束):

    'I am string one'
    'I am string two'
    'I am string-three with new line'
    'I am string-four'
    'I am string five'
    

答案 2 :(得分:0)

看起来好像是要拆分每行的第一行 - 所以你需要删除&#34;换行符的每个实例 - &#34;

 str.replace("\n-", '\n')

然后删除最初的&#34; - &#34;

str = str.substring(1);