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

Posted

技术标签:

【中文标题】如何使用扫描仪和模式类匹配文本中的模式?【英文标题】:How Match a Pattern in Text using Scanner and Pattern Classes? 【发布时间】:2011-06-22 09:44:00 【问题描述】:

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

我为此使用以下类:

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+\\d1,\\s+\\d1,\\s+");
     while(sr.hasNext(p))
     
         System.out.println("Pattern exists");
         System.out.println("Matched String : "+sr.next(p));
     

但是, 模式不匹配,即使它存在于那里..

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

\\s+([a-zA-Z])1\\s+\\d1,\\s+\\d1,\\s+"

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

【问题讨论】:

【参考方案1】:

这条正则表达式行有效:

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

您的matcher (p.matcher) 中的group(0) 提供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

【讨论】:

我刚试了一下,效果很好。您确定要提取匹配器的第一个 group 吗? 你试过这条线吗:- DBREF 1A1F A 102 190 UNP P08046 EGR1_MOUSE 308 396 是的,这也有效。我现在给你一个完整的例子来说明我的观点。【参考方案2】:

我不确定 Scanner 是否是最好的工具,因为 hasNext(Pattern) 检查下一个 complete token 是否具有下一个模式。您的模式跨越令牌。

您是否尝试过使用 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+\\d1,\\s+\\d1,\\s+");

        Matcher matcher = p.matcher(line);

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

【讨论】:

仍然无法正常工作.. 我认为问题出在 pattern.compile 参数上 他们为我工作得很好。也许有点冗长,但它们应该可以工作。尝试如上所示的小型编译测试程序。 你试过这条线吗:- DBREF 1A1F A 102 190 UNP P08046 EGR1_MOUSE 308 396 我已经尝试过在我的代码中发布的行,并且效果很好。尝试时会发生什么? 我怀疑您的程序中存在您未显示的错误。同样,创建一个非常小的可编译可运行示例,就像我发布的那样,然后将此代码作为补充发布在您的问题中,让我们测试您的实际代码。 -- 编辑:没关系! :) 很高兴你能成功!

以上是关于如何使用扫描仪和模式类匹配文本中的模式?的主要内容,如果未能解决你的问题,请参考以下文章

GLib 正则表达式匹配在特定匹配和模式上给出分段错误

文本文件规范化和模式匹配

使用 sed 在第 N 个匹配模式之后插入一些文本

如何在匹配器组而不是整个模式上追加替换?

如何使用与号 (&) 替换匹配模式中的字符

gawk