首页 > 解决方案 > 如何使用 Pattern 和 Matcher 使程序输出整个单词

问题描述

我有一个文本(例如"All Java programmers program good programs."),需要输出program里面的所有单词。

Pattern pattern = Pattern.compile("program");
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
    System.out.println(matcher.start() + " " + extractWord(matcher.start(), text));
}

我可以写一个Pattern可以找到诸如“程序员”之类的词的Matcher结果吗?

我自己将方法编写extractWord为:

public static String extractWord(int start, String line) {
    int n = 0;
    while (start + n < line.length()) {
        if (line.charAt(start + n) == ' ' || line.charAt(start + n) == '.') {
            break;
        } else {
            n++;
        }
    }
    return line.substring(start, start + n);
}

但我不喜欢这样做。

标签: javaregex

解决方案


一个简单的解决方案包括将您的正则表达式更改为\w*program\w*. 这将匹配任何包含单词的单词program以及由单词字符(即字母、数字和下划线)组成的任何可能的前缀和后缀。然后,用于matcher.group()检索匹配器找到的匹配项。

更高级的方法是使用正则表达式[a-z]*program[a-z]*。这将匹配任何包含的单词program以及仅由字母组成的任何可能的前缀和后缀。Pattern.CASE_INSENTITIVE标志匹配大小写字母。

Java (OpenJDK 8) , 856 字节

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

public class Main
{
    public static final String simpleText = "All Java programmers program good programs.";
    public static final String complexText = "All Java deProGraMMers Program good pRoGrAmS.";

    public static void main(String[] args)
    {
        System.out.println("Groups for '" + simpleText + "':");
        printGroups(simpleText);
        System.out.println("Groups for '" + complexText + "':");
        printGroups(complexText);
    }

    private static void printGroups(String text)
    {
        String regex = "[a-z]*program[a-z]*";
        Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher(text);
        while (matcher.find())
        {
            System.out.println(matcher.group());
        }
    }
}

执行输出:

 Groups for 'All Java programmers program good programs.':
 programmers
 program
 programs
 
 Groups for 'All Java deProGraMMers Program good pRoGrAmS.':
 deProGraMMers
 Program
 pRoGrAmS

在线尝试!


推荐阅读