我的程序用于过滤以大写字母[AM]开头的名称,并过滤出长度小于5且大于9的任何名称。代码确实过滤出长度小于5的名称。但是当我输入的名称长度大于9时,它会切断其余名称。
例如:巴塞洛缪会切成巴塞洛缪,而不是不使用巴塞洛缪。
我试图将长度标志移到正则表达式字段中的不同位置。除此之外,我对正则表达式不太了解,无法尝试更多。至于将这些字符串放到另一个函数中只是为了测试长度-我正在尝试在一个正则表达式字段中创建它。
import java.io.File;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Egor {
public static void main(String args[]) throws Exception{
Scanner s = new Scanner(new File("Names.dat"));
String[] names = new String[30];
int i = 0;
while(s.hasNext()) {
names[i] = s.next();
i++;
}
String store = "";
for (String str: names) {
store = store + str + " ";
}
System.out.println(store);
Pattern checkName = Pattern.compile("([A-M][a-z]{5,9})");
Matcher matcher = checkName.matcher(store);
System.out.println("-----------------------");
while (matcher.find()) {
System.out.println(matcher.group());
}
}
}
预期的名称应打印出来-Ashley,Brendan,Henry会打印出来 出乎意料的是,像-巴塞洛缪(Bartholomew)这样的名称,长度大于9的字样会打印到巴塞洛姆(
答案 0 :(得分:-1)
您需要为分隔您的姓名的所需字符添加正面外观,正面外观和正面外观。根据您的代码,看起来分别是字符串锚点或空格的开始,以及字符串锚点或空格的结束,分别用于向后看和向前看。看起来像这样:
(?<=\b)([A-M][a-z]{5,9})(?=\b)
在正则表达式中向前看和向后看都匹配前后匹配的内容,但不要将其包括在匹配结果中。