Java模式匹配器评估正则表达式错误?

时间:2013-09-18 19:00:46

标签: java regex

我按照this link中提供的所有答案(我最初发布了该问题) 并改变了我的正则表达式。

例如,我的正则表达式现在是

  String regex = "(?i)[a-zA-Z0-9_.|-]*" + searchString + "(?i)[a-zA-Z0-9_.|-]*";

当我使用“test”作为我的搜索字符串进行搜索时,我想返回“testEcho”和“testEcho-1”作为我的搜索输出。

但是当我搜索“test”字符串时,我仍然无法返回testEcho和testEcho-1作为我的结果。

我的java代码是;

Pattern pattern=Pattern.compile(regex);
Matcher matcher = pattern.matcher(Name)

if (matcher.matches()) {
return XXX;
}

任何帮助?

编辑:

Pattern pattern=Pattern.compile(regex);
 Matcher matcher1 = pattern.matcher("testEcho")

    matcher1.matches --------->returns true

Matcher matcher2 = pattern.matcher("testEcho-1")

 matcher2.matches --------->returns false

2 个答案:

答案 0 :(得分:3)

我不确定您的输入数据是什么样的,但您可能

  • 应使用find代替matches
  • 需要使用-在字符类中转义\\-,或将其放在开头[-...]或结束[...-]
  • 可以用a-zA-Z0-9_替换\\w
  • 使用searchString
  • Pattern.quote()转义正则表达式元字符

所以你的正则表达式看起来像

String regex = "(?i)[\\w.|-]*" + Pattern.quote(searchString) + "[\\w.|-]*";

试试这种方式

public static List<String> giveMe(String searchString, String input) {
    List<String> results = new ArrayList<>();
    String regex = "(?i)[\\w.|-]*" + Pattern.quote(searchString) + "[\\w.|-]*";

    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(input);

    while (matcher.find()) {
        results.add(matcher.group());
    }

    return results;
}

演示

System.out.println(giveMe("test","This is some string with testEcho " +
        "and even testEcho-1 that I want to parse."));

输出:

[testEcho, testEcho-1]

[编辑]
根据您的示例判断,您要检查整个字符串是否与指定的正则表达式匹配。在这种情况下,可以尝试这种方法

public static boolean canFind(String searchString, String input) {
    return input.matches("(?i)[\\w.|-]*" + Pattern.quote(searchString)
            + "[\\w.|-]*");
}

演示

System.out.println(canFind("test", "testEcho" ));//true
System.out.println(canFind("test", "TestEcho-1"));//true
System.out.println(canFind("test", "WestEcho-1"));//false

答案 1 :(得分:1)

我相信即使在Java中也只能为1个正则表达式模式设置一组标志,如果忽略大小写,则不需要 [a-zA-Z]

String regex = "(?i)[a-z0-9_.|-]*" + searchString + "[a-z0-9_.|-]*";