解决Android / Java Pattern / Matcher Regex非常长的字符串限制

时间:2016-12-06 10:22:21

标签: android regex string

我正在解析很长的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)有关吗?或者以某种方式奇怪地限制?

1 个答案:

答案 0 :(得分:1)

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

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

请参阅regex demo

它将匹配:

  • [csqtamlzhvxkf] - 来自
  • 的字母
  • (?:[^/csqtamlzhvxkf]*(?:/[^/]*/[^/csqtamlzhvxkf]*)*)* - 0+序列:
    • [^/csqtamlzhvxkf]* - 除了
    • 中的字符以外的0个字符
    • (?:/[^/]*/[^/csqtamlzhvxkf]*)* - 0+序列:
      • /[^/]*/ - /后跟0 {+ 1}}以及/
      • 以外的0个字符
      • / - 除了
      • 中的字符以外的0个字符