编辑:为了解释我的动机,我正在编写一个命令行实用程序,它接受一个日志文件和一个模式(一个非正则表达式字符串,指示每个日志条目的样子),将模式转换为正则表达式,并将文件的每一行与正则表达式匹配,生成一组日志事件,然后以另一种格式(例如,JSON)输出。我不能假设输入模式是什么或文件包含什么。
我想解析键值对的CSV列表。我需要从列表中捕获单个键和值。输入字符串示例:
07/04/2012< DEBUG> a = 1,b = foo,c = bar :你好世界!\ n
我verified下面的正则表达式正确地从输入中提取键和值:
// 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"
但是这个正则表达式(与上面的正则表达式相同,带有额外的“东西”)does not work如预期的那样:
// 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正则表达式是什么?
答案 0 :(得分:1)
使用"\\w+=\\w+"
获取结果:(“a = 1”“b = foo”“c = bar”),与=
分开。
答案 1 :(得分:1)
正确的正则表达式取决于您要实现的目标。在后一种情况下,结果对于正则表达式是正确的。这是因为短语<DEBUG>
是正则表达式的一部分,尾随: .*
也是其中的一部分,因此两者都将匹配,因此只有一个合适的字符串片段。
我个人会寻求另一种解决方案 - 而不是直接使用正则表达式,我会使用split
。例如,如果您感兴趣的部分始终在>
和:
和之间,则该部分中没有此类字符,您可以只需与substring
,indexOf
和split
相处即可。您可以执行两次拆分(一次使用,
以获得所有key=value
对,然后每对=
。但这只是我的解决方案而且可能不是最佳解决方案 - 我很乐意看到它。
答案 2 :(得分:1)
正则表达式:
\d{2}/\d{2}/\d{4}\s<DEBUG>\s([^=]+)=([^,\s]+)[,\s]([^=]+)=([^,\s]+)[,\s]([^=]+)=([^\s]+)\s:.*
修改强>: 如果计数可以是任意数,请尝试以下计数。
Scanner s = new Scanner("07/04/2012 <DEBUG> a=1, b=foo, c=bar : d=erere m=abcd hello world!");
Pattern p = Pattern.compile("(?<=\\s|,)[^\\s=]+=[^,\\s]+");
String out;
while((out = s.findInLine(p))!=null) {
System.out.println(Arrays.toString(out.split("=")));
}
输出:
[a, 1]
[b, foo]
[c, bar]
[d, erere]
[m, abcd]