java - 如何使用 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);
}
但我不喜欢这样做。
解决方案
一个简单的解决方案包括将您的正则表达式更改为\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