如何使用模式匹配器仅获取与 Java 中正则表达式匹配的第一行?

Posted

技术标签:

【中文标题】如何使用模式匹配器仅获取与 Java 中正则表达式匹配的第一行?【英文标题】:How to get only the first line matching the regex in Java using Pattern matcher? 【发布时间】:2017-02-04 12:17:07 【问题描述】:

假设我在一个文本文件中有一个足球俱乐部名称列表,每行一个名称。

Arsenal
Manchester United
Chelsea
Liverpool
...
...
Manchester City
Real Madrid

假设我需要找到以“曼彻斯特”开头的行,我有下面的正则表达式。

Pattern clubman = Pattern.compile("Manchester.*");
Matcher matche = clubman.matcher(fileString);
        if (matche.find()) 

            System.out.println("Manchester club is :"
                    + matche.group(0));
        

但是我只需要匹配匹配正则表达式的第一行,即Manchester United。 但是Pattern.compile 正在寻找最后一个匹配项,即Manchester City

如何只获取与正则表达式匹配的第一行?

【问题讨论】:

匹配以字符串开头的行不需要正则表达式。 抱歉,此数据仅供参考。我处理机密数据,所以不能在这里发布。我的基本问题是只获得与模式匹配的第一行而不是最后一行。 无论如何,以字符串开头的匹配行不需要正则表达式。 【参考方案1】:

不要为此使用正则表达式。没有理由这样做,它只会让你的问题变得比它需要的更难。只需遍历文件中的每一行并执行类似的操作

string match = "Manchester";
if (line.length() >= match.length()) 
  if (line.substring(0, match.length()).equals(match)) 
    return line;
  

【讨论】:

抱歉,此数据仅供参考。我处理机密数据,所以不能在这里发布。我的基本问题是只得到与模式匹配的第一行而不是最后一行。 @CS_noob 没关系。我的回答是一样的。遍历每一行,检查是否匹配,如果匹配,则返回该行。如果您必须使用正则表达式来检查匹配项,那就去吧。无论如何,它会具有更好的性能,因为不需要处理整个文件。【参考方案2】:

要检查是否有匹配项,您应该使用 groupCount(). 您正在使用 find() 找到下一个匹配项,因此程序将打印第二个匹配项。

【讨论】:

以上是关于如何使用模式匹配器仅获取与 Java 中正则表达式匹配的第一行?的主要内容,如果未能解决你的问题,请参考以下文章

如何编写正则表达式模式来获取匹配的字符串?

如何使用 awk 打印匹配的正则表达式模式?

Java 正则表达式匹配数字模式

java 正则表达式 如何匹配固定长度的数字

对于正则表达式模式,如何确定与模式匹配的最长字符串的长度?

在 Redshift 中使用正则表达式来获取匹配模式之前的单词