【发布时间】:2017-07-16 14:21:31
【问题描述】:
我认为我使用的正则表达式模式可以整理一下,看起来更整洁一些,但我对正则表达式的了解有限。我想扫描并匹配输入文件中新行上的一系列字母和数字。
import java.io.File;
import java.util.Scanner;
import java.util.regex.*;
public class App {
public static void main(String[] args) throws Exception {
if (args.length == 1) {
String fileName = args[0];
String fileContent = new Scanner(new File(fileName))
.useDelimiter("\\Z").next();
ArrayList<Integer> parsedContent = new ArrayList<>();
parsedContent = parseContentFromFileContent(fileContent);
int firstInt = parsedContent.get(0);
int secondInt = parsedContent.get(1);
int thirdInt = parsedContent.get(2);
int fourthInt = parsedContent.get(3);
int fifthInt = parsedContent.get(4);
System.out.println("First: " + firstInt);
System.out.println("Second: " + secondInt);
System.out.println("Third: " + thirdInt);
System.out.println("Fourth: " + fourthInt);
System.out.println("Fifth: " + fifthInt);
return;
}
}
public static ArrayList<Integer> parseContentFromFileContent(String fileContent) {
ArrayList<Integer> parsedInts = new ArrayList<>();
String pattern = "(.+?).((?:\\d*\\.)?\\d+)?\\n..((?:\\d*\\.)?\\d+)?\\n(.+?).((?:\\d*\\.)?\\d+)";
Pattern p = Pattern.compile(pattern, Pattern.DOTALL);
Matcher m = p.matcher(fileContent);
if (m.matches()) {
// Group 1: Has to match two letters
switch (m.group(1)) {
case "ab":
parsedInts.add(1);
break;
case "cd":
parsedInts.add(2);
break;
case "ef":
parsedInts.add(3);
break;
}
// Group 2: Has to match a number
parsedInts.add(Integer.parseInt(m.group(2)));
// Group 3: Has to match a letter
parsedInts.add(Integer.parseInt(m.group(3)));
// Group 4: Has to match a single letter
switch (m.group(4)) {
case "a":
parsedInts.add(1);
break;
case "b":
parsedInts.add(2);
break;
case "c":
parsedInts.add(3);
break;
}
// Group 5: Has to match a number
parsedInts.add(Integer.parseInt(m.group(5)));
}
return parsedInts;
}
}
输入文件:
ab-123 // Group 1 - Two letters a-z and Group 2 - Number
A=1 // Group 3 - Always A= [number]
a-1 // Group 4 - Letter a-z and Group 5 - Number
cd-1234
A=2
b-2
ef-12345
a=4
c-3
gh-123456
a=4
d-4
有没有更好(更干净)的正则表达式模式可以用来从上面的文件中捕获数据。
pattern = (.+?).((?:\\d*\\.)?\\d+)?\\n..((?:\\d*\\.)?\\d+)?\\n(.+?).((?:\\d*\\.)?\\d+)
【问题讨论】:
-
在你的模式中,你使用了很多
.+?,你的描述是two letters或always A=——你可以和你的描述一样具体,所以使用[a-z]{2}或A=。此外,您的正则表达式考虑十进制数,而显示的输入中没有,因此您可以删除(?:\\d*\\.)?。此外,您所有的号码匹配模式都是可选的,为什么? -
所以如果你的输入总是像这里显示的那样,你可能像
([a-z]{2})-(\d+)\n[Aa]=(\d+)\n([a-z])-(\d+)一样具体,在java中使用双反斜杠。 -
太好了。谢谢@SebastianProske
-
我无法将此答案标记为正确
-
因为这不是答案,只是要求澄清的评论。看来我所有的假设都是正确的,我会在稍后写一个答案,先去吃饭:)
标签: java regex parsing java.util.scanner