java - 如何使用 Java 正则表达式从字符串中解析此 CSV 列表?

标签 java regex

编辑:为了解释我这样做的动机,我正在编写一个命令行实用程序,它接受一个日志文件和一个模式(一个非正则表达式字符串,指示每个日志条目的样子),将模式转换为正则表达式,并将文件的每一行与正则表达式进行匹配,生成日志事件的集合,然后以另一种格式(例如 JSON)输出。我无法假设输入模式是什么或文件包含什么。


我想解析键值对的 CSV 列表。我需要从列表中捕获各个键和值。输入字符串示例:

07/04/2012 <DEBUG> a=1, b=foo, c=bar : hello world!\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 正则表达式是什么?

最佳答案

正则表达式:

\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]

关于java - 如何使用 Java 正则表达式从字符串中解析此 CSV 列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11131519/

相关文章:

带逗号的 Java 资源包格式

java - 在 JBoss (EAP6) 上禁用自动 wsdl 发布

javascript - 生成一个随机类并在 jQuery 中使用正则表达式读取

regex - regexp_replace 上的函数导致 Postgres

java - 正则表达式 - 如何确保两个字符之间或从开始到某个字符之间仅出现 1 个字符实例

java - servlet容器和spring容器有什么区别?

java - Dozer - 排除嵌套对象

java - java中检查对象类型的不同方法?

javascript - 退格键和空格键在 Firefox 中不起作用

c# - 正则表达式:找到整数但不是 float