您的位置:首页 > 编程语言 > Java开发

java正则表达式引起死循环导致程序卡主

2017-07-24 16:37 501 查看
public class RegularExpressionUtils {

    // demonstrates behavior for regular expression running into catastrophic backtracking for given input

    public static void main(String[] args) {

        Matcher matcher = createMatcherWithTimeout(

                "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "(x+x+)+y", 5000);

        System.out.println(matcher.matches());

        

    }

    public static Matcher createMatcherWithTimeout(String stringToMatch, String regularExpression, int timeoutMillis) {

        Pattern pattern = Pattern.compile(regularExpression);

        return createMatcherWithTimeout(stringToMatch, pattern, timeoutMillis);

    }

    public static Matcher createMatcherWithTimeout(String stringToMatch, Pattern regularExpressionPattern, int timeoutMillis) {

        CharSequence charSequence = new TimeoutRegexCharSequence(stringToMatch, timeoutMillis, stringToMatch,

                regularExpressionPattern.pattern());

        return regularExpressionPattern.matcher(charSequence);

    }

    private static class TimeoutRegexCharSequence implements CharSequence {

        private final CharSequence inner;

        private final int timeoutMillis;

        private final long timeoutTime;

        private final String stringToMatch;

        private final String regularExpression;

        public TimeoutRegexCharSequence(CharSequence inner, int timeoutMillis, String stringToMatch, String regularExpression) {

            super();

            this.inner = inner;

            this.timeoutMillis = timeoutMillis;

            this.stringToMatch = stringToMatch;

            this.regularExpression = regularExpression;

            timeoutTime = System.currentTimeMillis() + timeoutMillis;

        }

        public char charAt(int index) {

            if (System.currentTimeMillis() > timeoutTime) {

                throw new RuntimeException("Timeout occurred after " + timeoutMillis + "ms while processing regular expression '"

                                + regularExpression + "' on input '" + stringToMatch + "'!");

            }

            return inner.charAt(index);

        }

        public int length() {

            return inner.length();

        }

        public CharSequence subSequence(int start, int end) {

            return new TimeoutRegexCharSequence(inner.subSequence(start, end), timeoutMillis, stringToMatch, regularExpression);

        }

        @Override

        public String toString() {

            return inner.toString();

        }

    }

}

具体的参考://https://stackoverflow.com/questions/910740/cance
4000
lling-a-long-running-regex-match
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐