【问题标题】:Regex pattern for split用于拆分的正则表达式模式
【发布时间】:2013-08-01 21:29:04
【问题描述】:

我想解决这个问题。

  • , 逗号:拆分术语
  • " 双引号:字符串值(忽略特殊字符)
  • []数组

例如:

输入:a=1,b="1,2,3",c=[d=1,e="1,2,3"]

预期输出:

    a=1
    b="1,2,3"
    c=[d=1,e="1,2,3"]

但我无法得到以上结果。

我已经写了下面的代码:

 String line = "a=1,b=\"1,2,3\",c=[d=1,e=\"1,11\"]";
 String[] tokens = line.split(",(?=(([^\"]*\"){2})*[^\"]*$)");
 for (String t : tokens)
      System.out.println("> " + t);

我的输出是:

a=1
b="1,2,3"
c=[d=1
e="1,11"]

我需要进行哪些更改才能获得预期的输出?我应该坚持使用正则表达式还是其他解决方案更灵活、更易于维护?

【问题讨论】:

  • 不要转发您的问题,尤其是在没有解释您认为有必要转发的原因的情况下。 (如果针对该问题提供的答案不充分,请编辑 原始问题而不是重新发布。)另外,不要复制并粘贴某人的代码并说您“有写”它。
  • @PaulProgrammer 是的,但请看我的回答。只要结构不是太疯狂或太灵活,正则表达式就可以工作。
  • 当然,你可以做很多疯狂的事情,但这并不意味着你应该
  • 再次声明,请勿转发;编辑。未能收到适合您的答案是永远重新发布的充分理由。请记住,您最初的问题甚至还没有 24 小时开放。

标签: java regex parsing


【解决方案1】:

这个正则表达式可以解决问题:

",(?=(([^\"]*\"){2})*[^\"]*$)(?=([^\\[]*?\\[[^\\]]*\\][^\\[\\]]*?)*$)"

它的工作原理是在逗号后添加匹配方括号对的前瞻 - 如果您 一个方括号术语中,那么后面当然不会有平衡括号。

这是一些测试代码:

String line = "a=1,b=\"1,2,3\",c=[d=1,e=\"1,11\"]";
String[] tokens = line.split(",(?=(([^\"]*\"){2})*[^\"]*$)(?=([^\\[]*?\\[[^\\]]*\\][^\\[\\]]*?)*$)");
for (String t : tokens)
    System.out.println(t);

输出:

a=1
b="1,2,3"
c=[d=1,e="1,11"]

【讨论】:

  • 完美的例子!!谢谢
  • 如果故意建议的代码不适用于"c=[d=1,e=\"1,11\"],b=\"1,2,3\",a=1" ?
【解决方案2】:

我知道这个问题已经有将近一年的历史了,但是……这个正则表达式要简单得多:

\[[^]]*\]|"[^"]*"|(,)
  • | 的最左侧分支匹配 [complete brackets]
  • | 的下边匹配 \"strings like this\"
  • 右侧将逗号捕获到第 1 组,我们知道它们是正确的逗号,因为它们与左侧的表达式不匹配
  • 我们需要做的就是拆分到第 1 组

在第 1 组捕获上拆分

你可以这样做(见online demo底部的输出):

String subject = "a=1,b=\"1,2,3\",c=[d=1,e=\"1,11\"]";
Pattern regex = Pattern.compile("\\[[^]]*\\]|\".*?\"|(,)");
Matcher m = regex.matcher(subject);
StringBuffer b= new StringBuffer();
while (m.find()) {
if(m.group(1) != null) m.appendReplacement(b, "@@SplitHere@@");
else m.appendReplacement(b, m.group(0));
}
m.appendTail(b);
String replaced = b.toString();
String[] splits = replaced.split("@@SplitHere@@");
for (String split : splits) System.out.println(split);

这是一个两步拆分:首先,我们用独特的东西替换逗号,例如@@SplitHere@@

优点和缺点

  • 这种技术的主要好处是它非常易于理解和维护。如果您突然决定排除逗号{inside , curlies},您只需在正则表达式左侧添加另一个OR 分支:{[^{}]*}
  • 当您熟悉它时,您可以在许多情况下使用它
  • 在这种情况下,主要缺点是我们在拆分之前分两步进行替换。在我看来,与现代处理器无关。可维护的代码更为重要。

参考

这种技术有很多应用。在这两个链接中进行了充分的说明。

【讨论】:

    猜你喜欢
    • 2020-02-07
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    • 2010-11-03
    • 2019-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多