JAVA Regex-如何过滤长度大于特定数字的整个字符串?

时间:2019-04-10 02:24:34

标签: java regex

我的程序用于过滤以大写字母[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的字样会打印到巴塞洛姆(

1 个答案:

答案 0 :(得分:-1)

您需要为分隔您的姓名的所需字符添加正面外观,正面外观和正面外观。根据您的代码,看起来分别是字符串锚点或空格的开始,以及字符串锚点或空格的结束,分别用于向后看和向前看。看起来像这样:

(?<=\b)([A-M][a-z]{5,9})(?=\b)

在正则表达式中向前看和向后看都匹配前后匹配的内容,但不要将其包括在匹配结果中。