Java字符串与通配符匹配

时间:2017-07-26 08:10:45

标签: java regex pattern-matching wildcard

我有一个带有外卡的模式字符串,表示X(例如:abc *)。

此外,我还有一组字符串,我必须与给定的模式匹配。

例如:

abf - false

abc_fgh - true

abcgafa - true

fgabcafa - false

我尝试使用正则表达式,但它没有用。

这是我的代码

String pattern = "abc*";
String str = "abcdef";

Pattern regex = Pattern.compile(pattern);

return regex.matcher(str).matches();

返回false

还有其他方法可以使这项工作吗?

由于

4 个答案:

答案 0 :(得分:6)

只需将bash样式模式用于Java样式模式转换器:

public static void main(String[] args) {
        String patternString = createRegexFromGlob("abc*");
        List<String> list = Arrays.asList("abf", "abc_fgh", "abcgafa", "fgabcafa");
        list.forEach(it -> System.out.println(it.matches(patternString)));
}

private static String createRegexFromGlob(String glob) {
    StringBuilder out = new StringBuilder("^");
    for(int i = 0; i < glob.length(); ++i) {
        final char c = glob.charAt(i);
        switch(c) {
            case '*': out.append(".*"); break;
            case '?': out.append('.'); break;
            case '.': out.append("\\."); break;
            case '\\': out.append("\\\\"); break;
            default: out.append(c);
        }
    }
    out.append('$');
    return out.toString();
}

Is there an equivalent of java.util.regex for “glob” type patterns?
Convert wildcard to a regex expression

答案 1 :(得分:1)

abc*将是与ababcabccabccc等匹配的RegEx。 你想要的是abc.* - 如果abc应该是匹配字符串的开头,那么它是可选的,如果有任何后续的话。
否则,您可以在.*前面添加匹配中间为abc的字符串:.*abc.*

一般情况下,我建议您使用this这样的网站来学习RegEx。你要求一个非常基本的模式,但很难说你需要什么。祝好运!

编辑:
您似乎希望用户键入文件名的一部分(或左右),并且您希望提供类似搜索功能的内容(您可以在问题IMO中明确说明)。在这种情况下,您可以从用户的输入中烘焙自己的RegEx:

private Pattern getSearchRegEx(String userInput){
    return Pattern.compile(".*" + userInput + ".*");
}

当然,这只是一个非常简单的例子。您可以修改它,然后使用RegEx匹配文件名。

答案 2 :(得分:0)

所以我这里很瘦你的答案是: 您正在寻找的正则表达式为:[a][b][c].*

这是我的代码:

    String first = "abc"; // true
    String second = "abctest"; // true
    String third = "sthabcsth"; // false

    Pattern pattern = Pattern.compile("[a][b][c].*");

    System.out.println(first.matches(pattern.pattern())); // true
    System.out.println(second.matches(pattern.pattern())); // true
    System.out.println(third.matches(pattern.pattern())); // false

但是,如果您只想查看以“{1}}:String.startsWith()

的方法开头或结束

答案 3 :(得分:0)

你可以使用stringVariable.startsWith(“abc”)