Java 用空白分隔符分割字符串
Java split string with blank delimiter
我有一个字符串 我想拆分。我唯一的分隔符是空白 space。看起来像这样:
12 鲍勃马利 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);
结果是:
No:12 Ref:BobMarley Date:22/01/15 One:0 Sd:0 Dd:1 Tt:1 Vs:0
符合预期。一切都好。
现在,我的问题是字符串是:12 Bob Marley 22/01/15 0 0 1 1 0
或:12 哈利波特与乐队 22/01/15 0 0 1 1 0
输出将是:
No:12 Ref:Bob Date:Marley One:22/01/15 Sd0 Dd:0 Tt:1 Vs:1
预期:12 Ref:Bob 马利 Date:22/01/15 ......
知道如何才能 trim 只有 "No." 和 "Date" 之间的白色 space 吗?或者任何其他想法如何获得干净的 "Ref" 无论里面有多少个单词。谢谢!
选择在值中不是常用符号的分隔符通常是一种很好的做法。例如,选择空白 space 作为分隔符会导致包含空白 spaces.
的单个值出现问题
如果您可以更改文件中数据存储的约定,我建议您选择不同的分隔符 - 例如逗号。
如果您别无选择,只能使用空白 space 作为分隔符,那么您唯一的选择就是使用某种正则表达式对文件分区进行硬编码。
我不是最擅长正则表达式的,但这是我得到的:
/(\d+) ([\w ]+) (\d+\/\d+\/\d+) (\d) (\d) (\d) (\d) (\d)/
匹配
- 任意数字,后跟 space 和
- 任意数量的字母和 spaces,后跟 space 和
digits/digits/digits
,然后是 space 和
- 位数,space
- 位数,space
- 位数,space
- 位数,space
- 位数
或者,为了让每个人都更轻松,请使用逗号等分隔您的价值观。它们就是为那种东西而生的。
我建议首先使用正则表达式拆分行以捕获参考部分,然后使用 space 拆分以获得结果:
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];
我有一个字符串 我想拆分。我唯一的分隔符是空白 space。看起来像这样: 12 鲍勃马利 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);
结果是:
No:12 Ref:BobMarley Date:22/01/15 One:0 Sd:0 Dd:1 Tt:1 Vs:0
符合预期。一切都好。
现在,我的问题是字符串是:12 Bob Marley 22/01/15 0 0 1 1 0
或:12 哈利波特与乐队 22/01/15 0 0 1 1 0
输出将是:
No:12 Ref:Bob Date:Marley One:22/01/15 Sd0 Dd:0 Tt:1 Vs:1
预期:12 Ref:Bob 马利 Date:22/01/15 ......
知道如何才能 trim 只有 "No." 和 "Date" 之间的白色 space 吗?或者任何其他想法如何获得干净的 "Ref" 无论里面有多少个单词。谢谢!
选择在值中不是常用符号的分隔符通常是一种很好的做法。例如,选择空白 space 作为分隔符会导致包含空白 spaces.
的单个值出现问题如果您可以更改文件中数据存储的约定,我建议您选择不同的分隔符 - 例如逗号。
如果您别无选择,只能使用空白 space 作为分隔符,那么您唯一的选择就是使用某种正则表达式对文件分区进行硬编码。
我不是最擅长正则表达式的,但这是我得到的:
/(\d+) ([\w ]+) (\d+\/\d+\/\d+) (\d) (\d) (\d) (\d) (\d)/
匹配
- 任意数字,后跟 space 和
- 任意数量的字母和 spaces,后跟 space 和
digits/digits/digits
,然后是 space 和- 位数,space
- 位数,space
- 位数,space
- 位数,space
- 位数
或者,为了让每个人都更轻松,请使用逗号等分隔您的价值观。它们就是为那种东西而生的。
我建议首先使用正则表达式拆分行以捕获参考部分,然后使用 space 拆分以获得结果:
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];