我正在解析很长的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)有关吗?或者以某种方式奇怪地限制?
答案 0 :(得分:1)
问题来自导致冗余回溯的交替组。如果字符串中的/[^/]*/
很少见,请将模式展开为
(?i)[csqtamlzhvxkf](?:[^/csqtamlzhvxkf]*(?:/[^/]*/[^/csqtamlzhvxkf]*)*)*
请参阅regex demo
它将匹配:
[csqtamlzhvxkf]
- 来自(?:[^/csqtamlzhvxkf]*(?:/[^/]*/[^/csqtamlzhvxkf]*)*)*
- 0+序列:
[^/csqtamlzhvxkf]*
- 除了(?:/[^/]*/[^/csqtamlzhvxkf]*)*
- 0+序列:
/[^/]*/
- /
后跟0 {+ 1}}以及/
/
- 除了