【发布时间】:2014-10-28 14:05:42
【问题描述】:
我正在尝试从一个大文件中提取一些键值对及其前面的文本,但是使用的正则表达式运行速度很慢,因此需要优化。
输入由相当短的字符串组成,具有 1 或 2 个键值对,例如
one two three/1234==five/5678 some other text
或
one two three/1234==five/5678 some other text four/910==five/1112 more text
使用的(显然次优的)正则表达式是
(.*?)\s*([^ /]+)\s*/\s*([\d]+)\s*==\s*([^ /]+)\s*/\s*([\d]+)\s*
(空格可能出现在字符串中的多个区域,因此会出现重复的\s* 元素。)
测试上述的示例代码:
public static void main(String[] args) {
String text = "one two three/1234==five/5678 some other text";
text = "one two three/1234==five/5678 some other text four/910==five/1112 more text";
String regex = "(.*?)\\s*([^ /]+)\\s*/\\s*([\\d]+)\\s*==\\s*([^ /]+)\\s*/\\s*([\\d]+)\\s*";
Matcher matcher = Pattern.compile(regex).matcher(text);
int end = 0;
System.out.println("--------------------------------------------------");
while (matcher.find()) {
System.out.println("\"" + matcher.group(1) + "\"");
System.out.println(matcher.group(2) + " == " + matcher.group(3));
System.out.println(matcher.group(4) + " == " + matcher.group(5));
end = matcher.end();
System.out.println("--------------------------------------------------");
}
System.out.println(text.substring(end).trim());
}
输出是键值对,加上前面的文本(所有提取的字段都是必需的)。例如,对于较长的字符串,输出为:
--------------------------------------------------
"one two"
three == 1234
five == 5678
--------------------------------------------------
"some other text"
four == 910
five == 1112
--------------------------------------------------
more text
换句话说,matcher.find() 方法运行 1 轮或 2 轮,具体取决于字符串是短格式还是长格式(分别为 1 或 2 个键值对)。
问题在于提取速度低,有时,根据输入字符串的变化,find() 方法需要很长时间才能完成。
正则表达式有没有更好的形式来显着加快处理速度?
【问题讨论】:
标签: java regex parsing key-value