所以我得到了这份文件:
A-4 09-20-2083 B/2
A/4 04/27/2048 C-2
A/2b 1/24/75 A/4b
A/4 05/07/2049 A/2b
A/2b 7/ 3/31 B/2
A/2b 5/11/53 B-4b
C-4 14-07-2051 A/2
C-2b 22-12-44 A/4
C-4b 11-11-2055 C.2
A/2b 5/11/16 C-2
C.4 08.01.2058 A-4b
B-4b 2010-11- 2 B/2b
B/2b 26/ 3/13 A-4b
C-2 18-06-06 B-4
C.2 08.08.09 C-2
A/2 01/20/99 B-2b
C.4 18.08.2077 B/2
A-4b 10-21-2086 B/4b
B/2b 50/ 2/ 5 A/2
A/4 03/08/2001 A-2b
A/4b 11/ 8/2085 B/4
A/4 03/19/2058 C.2b
A/4b 6/18/2051 B-2
A-4 03-01-2001 B-2b
A-4 02-14-2066 C-4
A/2 06/23/48 A-4
C-4b 18- 8-2065 B/2b
C-2 06-04-94 B/4
B/4b 2057/ 9/21 A-2b
C.2b 21. 8.31 A/2b
A/4b 11/13/2098 A/4
A/2 04/31/63 C-2
B/2b 22/ 5/ 7 A-2
C-4 11-09-2032 B/4b
C.4 08.05.2085 B-2
B-4 2038-10-22 C.4
A/2 03/09/37 C.2b
A/2b 4/ 9/21 A/4
C.2b 3.12.95 B-4
C-4b 26- 1-2004 C-2如你所见,一些日期或行有随机的空格..。那么,如何使用regex或任何其他读取器正确地读取此输入?非常感谢!
发布于 2022-10-10 09:10:37
读取文件中的每一行,然后在拆分方法中使用regex“\s+”(多个空格的字符集)分隔它们。
编辑:我的坏消息,没有注意到日期值的空格。您可以使用“{2,}”作为对2个或2个以上空格的正则表达式。
这是从文件中检索每个数据的完整代码。
public static void read(String fileName){
//create file object
File file = new File(fileName);
//create file reader
FileReader fileReader = null ;
//define buffered reader
BufferedReader bufferedReader = null ;
try {
fileReader = new FileReader(file);
bufferedReader = new BufferedReader(fileReader);
String line;
while((line = bufferedReader.readLine()) != null){
//split lines into tokens (values) based on whitespace using regular expression "[ ]{2,}"
//to indicate two ore more instances of whitespace
String[] dataArray = line.trim().split("[ ]{2,}");
//iterate over array of strings
for(int i = 0 ; i< dataArray.length ; i++) {
//get each value as a string
String dateString = dataArray[i];
if(i==1) {
System.out.println(dateString);
}//prints out date in each line
}
}
} catch (FileNotFoundException e) {
// gets and prints filename
System.out.println("Sorry, " + file.getName() + " not found.");
} catch (IOException e) {
// prints the error message and info about which line
e.printStackTrace();
}finally {
//regardless, close file objects
try {
fileReader.close();
bufferedReader.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}发布于 2022-10-10 10:28:23
这里有一个快速而肮脏的解决方案,只需使用扫描仪即可工作。有些边缘情况可能会失败,但至少对给定的输入是这样的,而且对于某些变化的输入,它似乎很好。
import java.util.Scanner;
import java.util.Arrays;
class Main
{
public static void main (String args[])
{
String input =
"A-4 09-20-2083 B/2\nA/4 04/27/2048 C-2\nA/2b 1/24/75 A/4b\nA/4 05/07/2049 A/2b\nA/2b 7/ 3/31 B/2\nA/2b 5/11/53 B-4b\nC-4 14-07-2051 A/2\nC-2b 22-12-44 A/4\nC-4b 11-11-2055 C.2\nA/2b 5/11/16 C-2\nC.4 08.01.2058 A-4b\nB-4b 2010-11- 2 B/2b\nB/2b 26/ 3/13 A-4b\nC-2 18-06-06 B-4\nC.2 08.08.09 C-2\nA/2 01/20/99 B-2b\nC.4 18.08.2077 B/2\nA-4b 10-21-2086 B/4b\nB/2b 50/ 2/ 5 A/2\nA/4 03/08/2001 A-2b\nA/4b 11/ 8/2085 B/4\nA/4 03/19/2058 C.2b\nA/4b 6/18/2051 B-2\nA-4 03-01-2001 B-2b\nA-4 02-14-2066 C-4\nA/2 06/23/48 A-4\nC-4b 18- 8-2065 B/2b\nC-2 06-04-94 B/4\nB/4b 2057/ 9/21 A-2b\nC.2b 21. 8.31 A/2b\nA/4b 11/13/2098 A/4\nA/2 04/31/63 C-2\nB/2b 22/ 5/ 7 A-2\nC-4 11-09-2032 B/4b\nC.4 08.05.2085 B-2\nB-4 2038-10-22 C.4\nA/2 03/09/37 C.2b\nA/2b 4/ 9/21 A/4\nC.2b 3.12.95 B-4\nC-4b 26- 1-2004 C-2\n";
Scanner scanner = new Scanner(input);
while (scanner.hasNextLine())
{
String line = scanner.nextLine().trim();
String[] words = line.split(" ");
String[] filtered = Arrays.stream(words).filter(s -> !s.isEmpty()).toArray(String[]::new);
String first = filtered[0].trim ();
String third = filtered[filtered.length - 1].trim();
String[] dateArray = Arrays.copyOfRange(filtered, 1, filtered.length - 1);
String second = String.join("", dateArray);
System.out.println (first + "||" + second + "||" + third);
}
scanner.close();
}
}发布于 2022-10-10 12:26:52
如果你需要快速写作的话..。
String input = Files.readString(Path.of("path\\to\\your\\file.txt"));
//try-catch block omitted
Pattern.compile("(.+?)\\s+(.+?)\\s+(.+?)\\s*\n")
.matcher(input)
.results()
.map(m -> {
String firstGroupWithLetter = m.group(1); //"A-4" from first line
String date = m.group(2); //"09-20-2083"
String secondGroupWithLetter = m.group(3); //"B/2"
// m.group(0) is reserved for full match result or kind of that
// Do whatever you want
return null;
})
// further actions
;https://stackoverflow.com/questions/74012495
复制相似问题