Java拆分字符串与空白分隔符

时间:2016-02-17 22:08:57

标签: java string split line

我有一个想要分裂的字符串女巫。我唯一的分隔符是空格。看起来像这样: 12 BobMarley 22/01/15 0 0 1 1 0

我用这个:

line = br1.readLine();
String[] parts = line.split(" ");
String number    = parts[0]; 
String reference = parts[1]; 
String date      = parts[2];
String one       = parts[3];
String sd        = parts[4];
String dd        = parts[5];
String tt        = parts[6];
String vs        = parts[7];
System.out.println(
 "No:"+number+"Ref:"+reference+"Date:"+date+"One:"+one+"Sd:"+sd+"Dd:"+dd+"Tt:"+tt+"Vs:"+vs);

结果是:

否:12参考:BobMarley日期:22/01/15一:0 Sd:0 Dd:1 Tt:1 V​​s:0

正如所料。一切都好。

现在,我的问题是当字符串是:12 Bob Marley 22/01/15 0 0 1 1 0

或:12 Harry Potter And The Band 22/01/15 0 0 1 1 0

输出将是:

否:12 参考:Bob日期:Marley 一:22/01/15 Sd0 Dd:0 Tt:1 V​​s:1

预期:12参考:Bob Marley日期:2015年1月22日........

任何想法如何只修剪“号”之间的空白区域和“日期”?或者任何其他想法如何得到一个干净的“参考”,无论里面有多少字。谢谢!

4 个答案:

答案 0 :(得分:3)

我建议首先使用正则表达式分割线以捕获参考部分,然后使用空格分割以获得结果:

String line = "12 Bob Marley 22/01/15 0 0 1 1 0";

    String pattern = "([0-9]+)([a-zA-z|' ']+)(.*)";

    Pattern r = Pattern.compile(pattern);
    Matcher m = r.matcher(line);

    if(m.find()) {
        System.out.println("No:" + m.group(1));//this will get 12
        System.out.println("ref:" + m.group(2));//this will get the name
        String[] parts = m.group(3).split(" ");//this is the rest
        String date      = parts[0];
        String one       = parts[1];
        String sd        = parts[2];
        String dd        = parts[3];
        String tt        = parts[4];
        String vs        = parts[5];
        System.out.println("Date:"+date+"One:"+one+"Sd:"+sd+"Dd:"+dd+"Tt:"+tt+"Vs:"+vs);
    }

答案 1 :(得分:1)

我不是正则表达式中最伟大的,但这是我得到的:

/(\d+) ([\w ]+) (\d+\/\d+\/\d+) (\d) (\d) (\d) (\d) (\d)/

匹配

  • 任意数量的数字,后跟空格和
  • 任意数量的字母和空格,后跟空格和
  • digits/digits/digits,后跟空格和
  • 数字,空间
  • 数字,空间
  • 数字,空间
  • 数字,空间

http://regexr.com/3cqrj

或者,为了让每个人都更轻松,请用逗号分隔你的价值观。他们是为这类事做的。

答案 2 :(得分:0)

一般来说,选择一个不是值中常见符号的分隔符是一种好习惯。例如,选择空格作为分隔符会导致包含空格的单个值出现问题。

如果您可以更改文件中数据存储的合同,我建议您选择不同的分隔符 - 例如逗号。

如果除了使用空格作为分隔符之外别无选择,那么您唯一的选择就是使用某种正则表达式对文件的分区进行硬编码。

答案 3 :(得分:0)

查找日期显示位置的索引。使用s.indexOf("/")的简单版本,并确定它是否是两位数日

您也可以使用模式来执行此操作

Pattern pattern = Pattern.compile("\d{2}\/\d{2}\/\d{2}\/");
Matcher matcher = pattern.matcher(s);
startDateIdx = matcher.start();

endNumberIdx = s.indexOf(" ");

String number    = s.substring(0,endNumberIdx-1); 
String reference = s.substring(endNumberIdx+1,startDateIdx-1); 
String[] parts   = s.subtring(startDateIdx).split(" ");
String date      = parts[0];
String one       = parts[1];
String sd        = parts[2];
String dd        = parts[3];
String tt        = parts[4];
String vs        = parts[5];