如何使用扫描仪和模式类匹配文本中的模式?

时间:2011-02-06 20:42:09

标签: java regex pattern-matching java.util.scanner

我想查找我的文本文件中是否存在特定模式。

我正在使用以下课程:

java.util.regex.Pattern and java.util.Scanner;

我的示例文字行是

String Line="DBREF  1A1F A  102   190  UNP    P08046   EGR1_MOUSE     308    396";

并且,我希望匹配以下类型的模式:

A    102   190

其中,在A的位置a-z或A-Z,但是单个包机。

在102的位置任何整数和任何长度。

在190的位置任何整数和任何长度。

和,我的模式匹配代码是:

     Scanner sr=new Scanner(Line);
     Pattern p = Pattern.compile("\\s+([a-zA-Z]){1}\\s+\\d{1,}\\s+\\d{1,}\\s+");
     while(sr.hasNext(p))
     {
         System.out.println("Pattern exists");
         System.out.println("Matched String : "+sr.next(p));
     }

但是,      即使它存在,模式也不匹配..

我认为问题在于我的模式字符串:

\\s+([a-zA-Z]){1}\\s+\\d{1,}\\s+\\d{1,}\\s+"

任何人,Plz帮助我应该使用什么模式字符串????

2 个答案:

答案 0 :(得分:10)

我不确定Scanner是最好的工具,因为hasNext(模式)检查下一个完整令牌是否具有下一个模式。你的模式会遇到令牌。

您是否尝试过使用Matcher对象而不是Scanner?

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Foo2 {
    public static void main(String[] args) {
        String line = "DBREF  1A1F A  102    190  UNP     P08046    EGR1_MOUSE      308     396";
        Pattern p = Pattern.compile("\\s+[a-zA-Z]\\s+\\d{1,}\\s+\\d{1,}\\s+");

        Matcher matcher = p.matcher(line);

        while (matcher.find()) {
            System.out.printf("group: %s%n", matcher.group());
        }
        System.out.println("done");
    }
}

答案 1 :(得分:3)

此正则表达式适用:

\\s+\\w\\s+\\d+\\s+\\d+
matchergroup(0))的

p.matcher给出了A 102 190

[编辑]好的,我会给你一个完整的工作样本:

    Pattern p = Pattern.compile("\\s+\\w\\s+\\d+\\s+\\d+");
    Matcher matcher = p.matcher("DBREF  1A1F A  102   190  UNP    P08046   EGR1_MOUSE     308    396");
    matcher.find();
    System.out.println("Found match: " + matcher.group(0));
    // Found match:  A 102 190