-2

我按照此链接中提供的所有答案(我最初发布了该问题)并像这样更改了我的正则表达式。

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

  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
4

2 回答 2

3

我不确定您的输入数据如何,但您可能

  • 应该使用,find而不是matches
  • 需要-在字符类中转义\\-或将其放置在其 start[-...]或 end [...-]
  • 可以替换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
于 2013-09-18T19:04:00.460 回答
1

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

String regex = "(?i)[a-z0-9_.|-]*" + searchString + "[a-z0-9_.|-]*";
于 2013-09-18T19:15:04.867 回答