编辑:为了解释我的动机,我正在编写一个命令行实用程序,它接受一个日志文件和一个模式(一个非正则表达式字符串,指示每个日志条目的样子),将模式转换为正则表达式,并匹配文件的每一行都带有正则表达式,生成一组日志事件,然后以另一种格式(例如 JSON)输出。我不能假设输入模式是什么或文件包含什么。
我想解析一个 CSV 键值对列表。我需要从列表中捕获各个键和值。示例输入字符串:
07/04/2012 <DEBUG> a=1, b=foo, c=bar : hello world!\n
我验证了下面的正则表达式正确地从输入中提取键和值:
// regex
(([^,\s=]+)=([^,\s=]+)(?:,\s*(?:[^,\s=]+)=(?:[^,\s=]+))*?)
// input string
a=1, b=foo, c=bar
结果是:
// 1st call
group(1) == "a"
group(2) == "1"
// 2nd call
group(1) == "b"
group(2) == "foo"
// 3rd call
group(1) == "c"
group(2) == "bar"
但是这个正则表达式(与上面带有额外“东西”的正则表达式相同)不能按预期工作:
// regex
\d{2}/\d{2}/\d{4} <DEBUG> (([^,\s=]+)=([^,\s=]+)(?:,\s*(?:[^,\s=]+)=(?:[^,\s=]+))*?) : .*
// input string
07/04/2012 <DEBUG> a=1, b=foo, c=bar : hello world!
由于某种原因,结果是:
group(1) == "a=1, b=foo, c=bar"
group(2) == "a"
group(3) == "1"
// no more matches
提取键和值的正确 Java 正则表达式是什么?