对于给定的输入字符串
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()中的逗号,但输出中没有内容()
非常感谢任何帮助
答案 0 :(得分:3)
使用以下正则表达式,然后用空格替换匹配的逗号。
,(?=(?:"[^\["(){}\]]*"|\([^\["{}()\]]*\)|\[[^\["{}()\]]*\]|\{[^\["(){}\]]*}|[^"\[{}()\]])*$)
OR
,(?=(?:"[^"]*"|\([^()]*\)|\[[^\[\]]*\]|\{[^{}]*}|[^"\[{}()\]])*$)
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)
答案 2 :(得分:0)
,(?![^\[({]*[\])}])(?![^"']*["'](?:[^"']*["'][^"']*["'])*[^"']*$)
这应该对你有用。前瞻将确保,
不在括号或引号之间。参见演示。
https://regex101.com/r/jG2wO4/8
对于java escape \ again.make it \\
或者,如果你可以住一些额外的空间。尝试
(['"(\[{].*?['")}\]])|,
替换为$1
。请参阅演示。
答案 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]),)");