Java 正则表达式语句
我从来都不擅长正则表达式,我似乎无法得到这个 我试图沿着这些行匹配语句(我正在阅读的文本文件中有两行) 目前我使用这个语句已有一段时间了Java 正则表达式语句,java,regex,text-files,java.util.scanner,Java,Regex,Text Files,Java.util.scanner,我从来都不擅长正则表达式,我似乎无法得到这个 我试图沿着这些行匹配语句(我正在阅读的文本文件中有两行) 目前我使用这个语句已有一段时间了 reader.hasNext("\\w+ \\w+ \\d*\\.\\d{1,2} [0-5]") 但是它没有进入while语句。 当我删除while时,程序可以很好地读取文本文件。 代码段如下所示: private void initializeFileData(){ try { Scanner reader = new Scann
reader.hasNext("\\w+ \\w+ \\d*\\.\\d{1,2} [0-5]")
但是它没有进入while语句。
当我删除while时,程序可以很好地读取文本文件。
代码段如下所示:
private void initializeFileData(){
try {
Scanner reader = new Scanner(openedPath);
while(reader.hasNext("\\w+ \\w+ \\d*\\.\\d{1,2} [0-5]")){
employeeInfo.add(new EmployeeFile(reader.next(), reader.next(), reader.nextDouble(), reader.nextInt(), new employeeRemove()));
}
for(EmployeeFile element: employeeInfo){
output.add(element);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
将
\s
字符类用于单词之间的空格:
while(reader.hasNext("\\w+\\s\\w+\\s\\d*\\.\\d{1,2}\\s[0-5]"))
更新:
根据Scanner
类的javadoc,默认情况下,它使用空格分割其令牌。您可以通过Scanner
的uselimiter(字符串模式)
方法更改它使用的分隔符
private void initializeFileData(){
try {
Scanner reader = new Scanner(openedPath).useDelimiter("\\n");
...
while(reader.hasNext("\\w+\\s\\w+\\s\\d*\\.\\d{1,2}\\s[0-5]")){
...
使用
\s
字符类来表示单词之间的空格:
while(reader.hasNext("\\w+\\s\\w+\\s\\d*\\.\\d{1,2}\\s[0-5]"))
更新:
根据Scanner
类的javadoc,默认情况下,它使用空格分割其令牌。您可以通过Scanner
的uselimiter(字符串模式)
方法更改它使用的分隔符
private void initializeFileData(){
try {
Scanner reader = new Scanner(openedPath).useDelimiter("\\n");
...
while(reader.hasNext("\\w+\\s\\w+\\s\\d*\\.\\d{1,2}\\s[0-5]")){
...
从我所看到的(如果我错了,请纠正我,因为正则表达式似乎总是欺骗我的大脑:p),您没有正确处理空格。您需要使用\s,而不仅仅是标准的“”字符
编辑:对不起,\s。有人比我抢先一步:从我所看到的(如果我错了,请纠正我,因为正则表达式似乎总是欺骗我的大脑:p),你没有正确处理空格。您需要使用\s,而不仅仅是标准的“”字符
编辑:对不起,\s。有人打败了我:事实上
\w+
将为Lname Fname 12.35 1
捕获[Lname,Fname,12,35,1]
。因此,您可以只存储reader.nextLine()
,然后从中提取所有正则表达式匹配项。从这里,您可以对其进行一些抽象,例如:
class EmployeeFile {
.....
public EmployeeFile(String firstName, String lastName,
Double firstDouble, int firstInt,
EmployeeRemove er){
.....
}
public EmployeeFile(String line) {
//TODO : extract all the required info from the string array
// instead of doing it while reading at the same time.
// Keep input parsing separate from input reading.
// Turn this into a string array using the regex pattern
// mentioned above
}
}
实际上
\w+
将为Lname Fname 12.35 1
捕获[Lname,Fname,12,35,1]
。因此,您可以只存储reader.nextLine()
,然后从中提取所有正则表达式匹配项。从这里,您可以对其进行一些抽象,例如:
class EmployeeFile {
.....
public EmployeeFile(String firstName, String lastName,
Double firstDouble, int firstInt,
EmployeeRemove er){
.....
}
public EmployeeFile(String line) {
//TODO : extract all the required info from the string array
// instead of doing it while reading at the same time.
// Keep input parsing separate from input reading.
// Turn this into a string array using the regex pattern
// mentioned above
}
}
我创建了自己的版本,没有文件和最后一个循环,如下所示:
private static void initializeFileData() {
String[] testStrings = {"Lname Fname 12.35 1", "Jones Bananaman 7.1 3"};
Pattern myPattern = Pattern.compile("(\\w+)\\s+(\\w+)\\s+(\\d*\\.\\d{1,2})\\s+([0-5])");
for (String s : testStrings) {
Matcher myMatcher = myPattern.matcher(s);
if (myMatcher.groupCount() == 4) {
String lastName = myMatcher.group(1);
String firstName = myMatcher.group(2);
double firstValue = Double.parseDouble(myMatcher.group(3) );
int secondValue = Integer.parseInt(myMatcher.group(4));
//employeeInfo.add(new EmployeeFile(lastName, firstName, firstValue, secondValue, new employeeRemove()));
}
}
}
请注意,为了创建组,我删除了点之前的斜杠(您需要的是点,而不是任何字符),并插入了括号
我希望有帮助。我创建了自己的版本,没有文件和最后一个循环,如下所示:
private static void initializeFileData() {
String[] testStrings = {"Lname Fname 12.35 1", "Jones Bananaman 7.1 3"};
Pattern myPattern = Pattern.compile("(\\w+)\\s+(\\w+)\\s+(\\d*\\.\\d{1,2})\\s+([0-5])");
for (String s : testStrings) {
Matcher myMatcher = myPattern.matcher(s);
if (myMatcher.groupCount() == 4) {
String lastName = myMatcher.group(1);
String firstName = myMatcher.group(2);
double firstValue = Double.parseDouble(myMatcher.group(3) );
int secondValue = Integer.parseInt(myMatcher.group(4));
//employeeInfo.add(new EmployeeFile(lastName, firstName, firstValue, secondValue, new employeeRemove()));
}
}
}
请注意,为了创建组,我删除了点之前的斜杠(您需要的是点,而不是任何字符),并插入了括号
我希望它能有所帮助。我之前试过,但没有成功,我还使用了您的代码进行了双重检查,但没有成功。我更改了它,因为我非常确定它应该与\\s或''一起工作。不管怎样,还是不行。嗯。。。那么,您是否需要为扫描器使用不同的分隔符,以便扫描器按换行符而不是空格分割令牌<代码>扫描仪阅读器=新扫描仪(openedPath)。使用分隔符(\\n”)代码>我之前尝试过,但没有成功,我还使用了你的代码进行了双重检查,但没有成功。我更改了它,因为我非常确定它应该与\\s或''一起工作。不管怎样,还是不行。嗯。。。那么,您是否需要为扫描器使用不同的分隔符,以便扫描器按换行符而不是空格分割令牌<代码>扫描仪阅读器=新扫描仪(openedPath)。使用分隔符(\\n”)代码>