【问题标题】:User oriented regex library for java面向用户的 Java 正则表达式库
【发布时间】:2010-06-15 15:48:50
【问题描述】:

我正在寻找一个可以执行“简单”模式匹配的库,这是一种可以通过 GUI 向用户公开的模式。

它应该定义一个简单匹配语法,比如*匹配任何字符等等。

换句话说,我想做像 sun 的实现逻辑 http://openjdk.java.net/projects/nio/javadoc/java/nio/file/PathMatcher.html 那样的 glob(globbing),但与文件系统无关。

想法?

【问题讨论】:

    标签: java pattern-matching glob


    【解决方案1】:

    扩展“包含”关系的模式匹配对用户来说总是很困难。用户可能理解的是“*”用于任意数据和“?”的简单用法。仅用于一个任意字符。

    就像 SQL 的“like”,我真的很想把“like”暴露给用户,他们也喜欢。

    【讨论】:

      【解决方案2】:

      我想我为这个 http://jakarta.apache.org/oro/api/org/apache/oro/text/GlobCompiler.html 找到了一个 apache commons 类

      【讨论】:

        【解决方案3】:

        对于仅使用 * 和 ?作为特殊字符,应该很容易将它们转换为正则表达式模式,而无需引入全新的库。以下代码未经测试,但我使用了非常相似的方法将 sql“like”表达式转换为正则表达式:

        public static boolean globMatches(String glob, String target) {
            Pattern p = Pattern.compile("(\\*+)|(\\?)|([^*?]+)");
            Matcher m = p.matcher(glob);
            StringBuilder sb = new StringBuilder();
            while (m.find()) {
                String star = m.group(1);
                String question = m.group(2);
                String text = m.group(3);
                if (star != null) {
                    sb.append(".*");
                }
                else if (question != null) {
                    sb.append(".");
                }
                else {
                    sb.append(Pattern.quote(text));
                }
            }
        
            return target.matches(sb.toString());
        }
        

        【讨论】:

        • 一个不错的解决方案,但是在用户尝试搜索文字 * 时会发生什么?我们还需要为此添加支持。加上极端情况......我认为对于这些任务,图书馆是一个更好的解决方案。
        猜你喜欢
        • 1970-01-01
        • 2015-12-29
        • 2018-03-07
        • 1970-01-01
        • 2018-07-13
        • 1970-01-01
        • 2016-02-08
        • 2016-09-28
        相关资源
        最近更新 更多