2011-02-06 53 views
5

我想查找一个特定的模式是否存在于我的文本文件中。如何使用扫描仪和模式类匹配文本中的模式?

即时通讯使用下面的类此:

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的位置az或AZ,但单一章程。

在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帮我我应该使用什么模式字符串?

回答

10

我不确定Scanner是否是最好的工具,因为hasNext(模式)检查以查看下一个完整标记是否具有下一个模式。你的模式通过令牌。

您是否尝试过使用Matcher对象而不是扫描仪?

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"); 
    } 
} 
+0

仍然没有工作。我认为问题是与pattern.compile参数 – 2011-02-06 21:01:21

+0

他们的工作对我罚款。也许有点冗长,但他们应该工作。尝试一下如上所示的小编译测试程序。 – 2011-02-06 21:02:30

3

此正则表达式线工程:

\\s+\\w\\s+\\d+\\s+\\d+ 

group(0)matcherp.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