为了账号安全,请及时绑定邮箱和手机立即绑定

是否有等效于java.util.regex的“ glob”类型模式?

是否有等效于java.util.regex的“ glob”类型模式?

天涯尽头无女友 2019-11-28 10:41:13
是否存在用于在Java中进行“全局”类型匹配的标准(最好是Apache Commons或类似的非病毒)标准库?当我不得不在Perl中做类似的事情时,我只是将所有的“ .” 更改为“ \.”,将“ *”更改为“ .*”,将“ ?”更改为“ .”,但是我想知道是否有人做了为我工作。
查看完整描述

3 回答

?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

这是一个处理*和?的简单Glob实现。在模式中


public class GlobMatch {

    private String text;

    private String pattern;


    public boolean match(String text, String pattern) {

        this.text = text;

        this.pattern = pattern;


        return matchCharacter(0, 0);

    }


    private boolean matchCharacter(int patternIndex, int textIndex) {

        if (patternIndex >= pattern.length()) {

            return false;

        }


        switch(pattern.charAt(patternIndex)) {

            case '?':

                // Match any character

                if (textIndex >= text.length()) {

                    return false;

                }

                break;


            case '*':

                // * at the end of the pattern will match anything

                if (patternIndex + 1 >= pattern.length() || textIndex >= text.length()) {

                    return true;

                }


                // Probe forward to see if we can get a match

                while (textIndex < text.length()) {

                    if (matchCharacter(patternIndex + 1, textIndex)) {

                        return true;

                    }

                    textIndex++;

                }


                return false;


            default:

                if (textIndex >= text.length()) {

                    return false;

                }


                String textChar = text.substring(textIndex, textIndex + 1);

                String patternChar = pattern.substring(patternIndex, patternIndex + 1);


                // Note the match is case insensitive

                if (textChar.compareToIgnoreCase(patternChar) != 0) {

                    return false;

                }

        }


        // End of pattern and text?

        if (patternIndex + 1 >= pattern.length() && textIndex + 1 >= text.length()) {

            return true;

        }


        // Go on to match the next character in the pattern

        return matchCharacter(patternIndex + 1, textIndex + 1);

    }

}


查看完整回答
反对 回复 2019-11-28
  • 3 回答
  • 0 关注
  • 477 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信