Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带空分隔符的Java拆分字符串_Java_String_Split_Line - Fatal编程技术网

带空分隔符的Java拆分字符串

带空分隔符的Java拆分字符串,java,string,split,line,Java,String,Split,Line,我有一个弦女巫,我想分开。我唯一的分隔符是一个空格。看起来像这样: 12 BobMarley 2015年1月22日01 我用这个: 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

我有一个弦女巫,我想分开。我唯一的分隔符是一个空格。看起来像这样: 12 BobMarley 2015年1月22日01

我用这个:

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日期:2015年1月22日一:0 Sd:0 Dd:1 Tt:1 Vs:0

正如所料。好的

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

或:12《哈利波特与乐队》2015年1月22日

输出将是:

编号:12参考号:鲍勃日期:马利一号:2015年1月22日星期二:0 Tt:1 Vs:1

预计:12参考号:鲍勃·马利日期:2015年1月22日


你知道我怎样才能只修剪号码和日期之间的空白吗?或任何其他想法如何得到一个干净的参考,无论有多少字里面。谢谢大家!

通常最好选择一个不是值中常用符号的分隔符。例如,选择空格作为分隔符会导致包含空格的单个值出现问题

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


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

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

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


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

我在正则表达式方面不是最棒的,但我得到的是:

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

任意位数,后跟空格和 任意数量的字母和空格,后跟空格和 数字/数字/数字,后跟空格和 数字、空格 数字、空格 数字、空格 数字、空格 数字
或者,为了让每个人都更容易,用逗号分隔你的值。它们是为这类事情而设计的。

我在regex不是最棒的,但我得到的是:

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

任意位数,后跟空格和 任意数量的字母和空格,后跟空格和 数字/数字/数字,后跟空格和 数字、空格 数字、空格 数字、空格 数字、空格 数字
或者,为了让每个人都更容易,用逗号分隔你的值。它们是为这类事情而设计的。

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

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

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

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

查找日期显示位置的索引。使用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];

查找日期显示位置的索引。使用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];

有没有理由不用逗号替换空格分隔符?我无法修改输入。该字符串是读取.PDF创建的文本文件中的一行。PDF是一个表,我想将其转换为tableModel,并从PDF表中创建一个jTable。如果您不想使用正则表达式,并且问题只是您描述的问题,那么这是一个愚蠢的解决方案:在空格处拆分,一旦您读取日期,就检查它是否为有效日期。如果没有,请将所有日期文本附加到引用中,否则只需读取日期并继续。有没有理由不将空格分隔符替换为逗号?我无法修改输入。该字符串是读取.PDF创建的文本文件中的一行。PDF是一个表,我想将其转换为tableModel,并从PDF表中创建一个jTable。如果您不想使用正则表达式,并且问题只是您描述的问题,那么这是一个愚蠢的解决方案:在空格处拆分,一旦您读取日期,就检查它是否为有效日期。如果没有,请将所有日期文本附加到引用中,否则只需读取日期并继续。