【问题标题】:java regex match string with asterisksjava 正则表达式匹配带星号的字符串
【发布时间】:2014-11-14 11:26:57
【问题描述】:

我必须创建一个正则表达式来比较插入到以下列表中的字符串:

ArrayList<String> entries = new ArrayList<>();
entries.add("text1/*");
entries.add("text2/*/*");
entries.add("text2/*/*/*");
entries.add("text1/*/*");
entries.add("text1/value1/*");
entries.add("*/*");

如果我有一个像“text1/value1/value2”这样的字符串,我如何理解哪个是遍历条目的匹配项?例如,在上面的条目中,正确的应该是第五个条目“text1/value1/*”。

【问题讨论】:

  • 那么您正在寻找的正确模式是什么?是什么/anthing/* 吗?
  • 是的,它是“text1/value1/*”第五个
  • 我用更好的正则表达式编辑了我的答案。测试一下

标签: java regex string pattern-matching


【解决方案1】:

我不知道要为此编写一个正则表达式,而是一个字符一个字符地解析它似乎要容易得多。

但是我刚刚做了一个项目,它使用了 Spring 框架提供的路径匹配器,它看起来对于 AntPathMatcher 来说是一个完美的工作。

public static void main(String [] args) throws Exception {
    org.springframework.util.AntPathMatcher pathMatcher = new org.springframework.util.AntPathMatcher();

    String path = "text1/value1/value2";
    ArrayList<String> entries = new ArrayList<String>();
    entries.add("text1/*");
    entries.add("text2/*/*");
    entries.add("text2/*/*/*");
    entries.add("text1/*/*");
    entries.add("text1/value1/*");
    entries.add("*/*");

    String bestMatch = null;
    // use a pattern comparator to see what pattern best matches this path
    Comparator<String> comp = pathMatcher.getPatternComparator(path);
    // go through all our patterns
    for(String pattern : entries) {
        // make sure the pattern matches the path
        if(pathMatcher.match(pattern, path)) {
            // check if we already have a match
            if(bestMatch != null) {
                // if we have a match take the best one of those 2... the one that best matches that is
                if(comp.compare(bestMatch, pattern) > 0) {
                    bestMatch = pattern;
                }
            } else {
                // no match found yet, lets use this one
                bestMatch = pattern;
            }
        }
    }
    System.out.println(bestMatch);
}

【讨论】:

    【解决方案2】:

    EDIT1:找到了更好的正则表达式。您可以将类似的逻辑应用于您的需求。我猜你必须根据输入字符串构建正则表达式?

    所用模式的解释:

    ^([^/*]+)/([^/*]+)/[*]$ ^ 字符串开头 [^/*] 匹配除 / 或 * 以外的任何字符 + 是匹配前面的字符或组 0 多次的量词 / 后跟字符 / [^/*] 匹配除 / 或 * 以外的任何字符 / 后跟字符 / [*] 后跟只有 1 个字符,即 * 而不是其他字符 $ 字符串结尾
    public static void main(String[] args) {
    
        final ArrayList<String> entries = new ArrayList<String>();
        entries.add("text1/*");
        entries.add("text2/*/*");
        entries.add("text2/*/*/*");
        entries.add("text1/*/*");
        entries.add("text1/value1/*");
        entries.add("*/*");
    
        final Pattern pattern = Pattern.compile("^([^/*]+)/([^/*]+)/[*]$", 2);
    
        for (String entry : entries) {
            Matcher matcher = pattern.matcher(entry);
            while (matcher.find()) {
                System.out.println("found correct entry: " + entry);
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-08
      • 2013-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-28
      • 1970-01-01
      相关资源
      最近更新 更多