Java - 使用正则表达式和新行拆分字符串
Java - Split String using regex and new line
我有一个文件,我将其扫描到我的程序中并使用以下代码将其存储在字符串中:
try {
data= new Scanner(new File("file.csv")).useDelimiter("\Z").next();
} catch (FileNotFoundException e) {
System.out.println("File not found");
}
file.csv 看起来像这样:
"RowA";"RowB"
55;56
57;58
59;60
61;62
现在,我正在尝试提取每个数字并将它们放入 String[] 中,如下所示:
String[] number= data.split(";|\r?\n|\"|[a-zA-Z]");
当我这样打印代码时:
for(int i = 0; i < number.length; i++){
System.out.println("Line: " + number[i]);
}
我得到以下输出:
Line:
Line:
Line:
Line:
Line:
Line:
Line:
Line:
Line:
Line:
Line:
Line:
Line:
Line:
Line: 55
Line: 56
Line: 57
Line: 58
Line: 59
Line: 60
Line: 61
Line: 62
为什么数组中的第一个索引是空白的,我该如何删除它?
谢谢。
在这个正则表达式中:
;|\r?\n|"|[a-zA-Z]
"
匹配字符串中的双引号 ("RowA";"RowB"
)
[a-zA-Z]
匹配 "RowA";"RowB"
. 中的每个字符
因此它在所有这些地方被分开,你得到空白。
如果不需要这些部分,您可以删除它们,使用:
String[] number= data.split(";|\r?\n");
我还看到您只需要数据中的数字,而不是 " 和字符。在这种情况下,您可以在拆分之前使用 replaceAll()
替换 "
和字符它。
data.replaceAll("\"|[a-zA-Z]","");
有关正则表达式的解决方案,请参阅@Hackerdarshi 的回答。
不过,我提出了一种替代方法,它可能更有效地解析数字。
您可以逐行读取文件,在 ";"
上拆分每一行,然后解析由拆分:
List<Integer> numbers = new ArrayList<>();
File file = new File("file.csv");
try (FileReader fileReader = new FileReader(file);
BufferedReader bufferedReader = new BufferedReader(fileReader)){
bufferedReader.readLine();
String line;
while ((line = bufferedReader.readLine()) != null) {
for (final String number : line.split(";")) {
numbers.add(Integer.parseInt(number));
}
}
} catch(final IOException e) {
e.printStackTrace();
}
如果您确定要为每组连续数字添加一个元素,那么快速简便的解决方案是:
String[] number= data.split("([^0-9])+");
只要您期望的每个值都是整数(没有小数点分隔符)并且其他任何地方都没有数字,这将提供您期望的输出。
编辑:
如果 data 的 first/last 字符不是数字,它将在 start/end 处添加 one 空项=17=]数数组.
我有一个文件,我将其扫描到我的程序中并使用以下代码将其存储在字符串中:
try {
data= new Scanner(new File("file.csv")).useDelimiter("\Z").next();
} catch (FileNotFoundException e) {
System.out.println("File not found");
}
file.csv 看起来像这样:
"RowA";"RowB"
55;56
57;58
59;60
61;62
现在,我正在尝试提取每个数字并将它们放入 String[] 中,如下所示:
String[] number= data.split(";|\r?\n|\"|[a-zA-Z]");
当我这样打印代码时:
for(int i = 0; i < number.length; i++){
System.out.println("Line: " + number[i]);
}
我得到以下输出:
Line:
Line:
Line:
Line:
Line:
Line:
Line:
Line:
Line:
Line:
Line:
Line:
Line:
Line:
Line: 55
Line: 56
Line: 57
Line: 58
Line: 59
Line: 60
Line: 61
Line: 62
为什么数组中的第一个索引是空白的,我该如何删除它?
谢谢。
在这个正则表达式中:
;|\r?\n|"|[a-zA-Z]
"
匹配字符串中的双引号 ("RowA";"RowB"
)[a-zA-Z]
匹配"RowA";"RowB"
. 中的每个字符
因此它在所有这些地方被分开,你得到空白。
如果不需要这些部分,您可以删除它们,使用:
String[] number= data.split(";|\r?\n");
我还看到您只需要数据中的数字,而不是 " 和字符。在这种情况下,您可以在拆分之前使用 replaceAll()
替换 "
和字符它。
data.replaceAll("\"|[a-zA-Z]","");
有关正则表达式的解决方案,请参阅@Hackerdarshi 的回答。
不过,我提出了一种替代方法,它可能更有效地解析数字。
您可以逐行读取文件,在 ";"
上拆分每一行,然后解析由拆分:
List<Integer> numbers = new ArrayList<>();
File file = new File("file.csv");
try (FileReader fileReader = new FileReader(file);
BufferedReader bufferedReader = new BufferedReader(fileReader)){
bufferedReader.readLine();
String line;
while ((line = bufferedReader.readLine()) != null) {
for (final String number : line.split(";")) {
numbers.add(Integer.parseInt(number));
}
}
} catch(final IOException e) {
e.printStackTrace();
}
如果您确定要为每组连续数字添加一个元素,那么快速简便的解决方案是:
String[] number= data.split("([^0-9])+");
只要您期望的每个值都是整数(没有小数点分隔符)并且其他任何地方都没有数字,这将提供您期望的输出。
编辑: 如果 data 的 first/last 字符不是数字,它将在 start/end 处添加 one 空项=17=]数数组.