这个问题在这里已有答案:
我的程序用于过滤掉以大写字母[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,亨利会打印出来的名字。意外的是像Bartholomew这样的名字,长度大于9打印到Bartholom
你需要添加一个积极的外观和积极的前瞻和积极的外观背后的所需字符分隔你的名字。基于您的代码,它看起来像是字符串锚点或空格的开头,以及字符串锚点或空间的结尾,用于后面的外观并分别向前看。看起来像这样:
(?<=\b)([A-M][a-z]{5,9})(?=\b)
展望未来,在正则表达式中匹配前后的后方,但不要在匹配的结果中包含它。