替换不在括号内的逗号,引号

时间:2015-02-18 06:37:35

标签: java regex

对于给定的输入字符串 abc,[def,ghi,ijk],lm,(no,pq,rs),[tu,vw,xy],zs,"as,as,fr" 输出应该是

abc [def,ghi,ijk] lm (no,pq,rs) [tu,vw,xy] zs "as,as,fr"

的 我试过这个 str.replaceAll("\\(.*?\\)|(,)", " "); 的 说我的字符串是str,它将替换不在inside()中的逗号,但输出中没有内容()

非常感谢任何帮助

4 个答案:

答案 0 :(得分:3)

使用以下正则表达式,然后用空格替换匹配的逗号。

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

OR

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

DEMO

String s = "\"f,g\",abc,[def,ghi,ijk],lm,(no,pq,rs),[tu,vw,xy],zs,\"as,as,fr\",foo,{bar,buz}";
System.out.println(s.replaceAll(",(?=(?:\"[^\\[\"(){}\\]]*\"|\\([^\\[\"{}()\\]]*\\)|\\[[^\\[\"{}()\\]]*\\]|\\{[^\\[\"(){}\\]]*}|[^\"\\[{}()\\]])*$)", " "));

<强>输出:

"f,g" abc [def,ghi,ijk] lm (no,pq,rs) [tu,vw,xy] zs "as,as,fr" foo {bar,buz}

<强>解释

  • ,匹配所有逗号

  • ,(?=如果紧随其后,

  • "[^\["(){}\]]*"双引号块,如"foo,bar"

  • |

  • \([^\["{}()\]]*\) paranthesis block,如(foo,bar)

  • |

  • \[[^\["{}()\]]*\]一个方括号,例如[foo,bar]

  • |

  • \{[^\["(){}\]]*}{foo,bar}

  • 这样的花括号块
  • |

  • [^"\[{}()\]]任何字符,但不包括"(){[或{{1} }或]

  • 零次或多次。这适用于整体,即}可能重复零次或多次。

  • (foo,bar)后跟行锚的结束。

答案 1 :(得分:1)

这是更简单的正则表达式。匹配此正则表达式:

(\[[^]]*\]|\([^)]*\)|"[^"]*"),?|,

并替换为:

"$1 "

RegEx Demo

答案 2 :(得分:0)

,(?![^\[({]*[\])}])(?![^"']*["'](?:[^"']*["'][^"']*["'])*[^"']*$)

这应该对你有用。前瞻将确保,不在括号或引号之间。参见演示。

https://regex101.com/r/jG2wO4/8

对于java escape \ again.make it \\

或者,如果你可以住一些额外的空间。尝试

(['"(\[{].*?['")}\]])|,

替换为$1。请参阅演示。

https://regex101.com/r/jG2wO4/7

答案 3 :(得分:0)

尝试使用这样的正则表达式:

public static void main(String... strings) {
    String s = "abc,[def,ghi,ijk],lm,(no,pq,rs),[tu,vw,xy],zs,\"as,as,fr\",xyz,pqr";
    String[] arr = s.split("(,(?![\\w,]+[\\]\\)\"]))|((?<=[\\]\"\\)]),)");
    for (String str : arr) {
        System.out.println(str);
    }
}

O / P:

abc
[def,ghi,ijk]
lm
(no,pq,rs)
[tu,vw,xy]
zs
"as,as,fr"
xyz
pqr

PS:以下代码也适用于single quotes and flower braces

String[] arr = s.split("(,(?![\\w,]+[^,\\w]))|((?<=[^,\\w]),)");