【问题标题】:Working around Android/Java Pattern/Matcher Regex very long string limit解决 Android/Java Pattern/Matcher Regex 非常长的字符串限制
【发布时间】:2016-12-06 10:22:20
【问题描述】:

我正在解析很长的 svg 路径。所以所有的 svg 命令都被正确匹配并提取了它们的数据。但是,当我有一个很长的字符串时,它基本上只是通过。即一个字符串 352,742 个字符。 (http://pastebin.com/c5XqpS3d)

(?i)[csqtamlzhvxkf](?:[^/csqtamlzhvxkf]|/[^/]*/)*

对于 commandParser 的正则表达式,它适用于较短的字符串,但是当给定一个长字符串时,它会跳过。即使字符串清楚地开始:

M 740.4895,514.99567 711.3773,501.32477...

显然任何以 M 开头的字符串都会匹配。但是,match.find() 只是返回 false,并说那里什么都没有。

    Matcher match = commandParser.matcher(path);
    while (match.find()) {
        int start = match.start();
        values.reset();
        values.ops = path.subSequence(start + 1, match.end());
        String command = path.substring(start,start+1);
        if (parser.matched(command,values)) {
            return true;
        }
    }

与平台(Android)有关吗?还是莫名其妙地受到限制?

【问题讨论】:

    标签: android regex string


    【解决方案1】:

    问题来自导致冗余回溯的交替组。如果/[^/]*/ 在您的字符串中很少见,请将模式展开为

    (?i)[csqtamlzhvxkf](?:[^/csqtamlzhvxkf]*(?:/[^/]*/[^/csqtamlzhvxkf]*)*)*
    

    regex demo

    它将匹配:

    • [csqtamlzhvxkf] - 一组字母
    • (?:[^/csqtamlzhvxkf]*(?:/[^/]*/[^/csqtamlzhvxkf]*)*)* - 0+ 个序列:
      • [^/csqtamlzhvxkf]* - 0+ 字符集以外的字符
      • (?:/[^/]*/[^/csqtamlzhvxkf]*)* - 0+ 个序列:
        • /[^/]*/ - / 后跟 0+ 个字符,而不是 //
        • [^/csqtamlzhvxkf]* - 0+ 字符集以外的字符

    【讨论】:

      猜你喜欢
      • 2014-09-08
      • 2012-11-25
      • 1970-01-01
      • 1970-01-01
      • 2012-06-10
      • 1970-01-01
      • 2012-03-24
      • 1970-01-01
      • 2021-02-01
      相关资源
      最近更新 更多