Java 替换不在括号、引号内的逗号

Java 替换不在括号、引号内的逗号,java,regex,Java,Regex,对于给定的输入字符串 abc、[def、ghi、ijk]、lm、(no、pq、rs)、[tu、vw、xy]、zs、“as、as、fr” 输出应该是 我试过这个 str.replaceAll(“\\(.*?\\)|(,)”,”) 假设我的字符串是str,它将替换不在()内的逗号,但输出内容将不在()内 非常感谢您的帮助 ,(?![^\[({]*[\])}])(?![^"']*["'](?:[^"']*["'][^"']*["'])*[^"']*$) 这对您来说应该很好。前瞻将确保,不在括号或

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

我试过这个
str.replaceAll(“\\(.*?\\)|(,)”,”)
假设我的字符串是str,它将替换不在()内的逗号,但输出内容将不在()内

非常感谢您的帮助

,(?![^\[({]*[\])}])(?![^"']*["'](?:[^"']*["'][^"']*["'])*[^"']*$)
这对您来说应该很好。前瞻将确保
不在括号或引号之间。请参阅演示

对于java
escape\再次。使其成为\\

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

(['"(\[{].*?['")}\]])|,
替换为
$1
。请参阅演示


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

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

输出:

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

"f,g" abc [def,ghi,ijk] lm (no,pq,rs) [tu,vw,xy] zs "as,as,fr" foo {bar,buz}
  • 匹配所有逗号

  • ,(?=
    仅当后跟

  • “[^\[”(){}\]]*”
    一个双引号块,如
    “foo,bar”

  • |

  • \([^\[“{}()\]]*\)
    类似于
    (foo,bar)

  • |

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

  • |

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

  • |

  • [^”\[{}()\]
    任何字符,但不属于
    {
    [
    ]
    }

  • 零次或多次。这适用于整体,就像
    (foo,bar)
    可以重复零次或多次

  • $
    后跟一个线端锚点


这里有一个更简单的正则表达式。匹配此正则表达式:

(\[[^]]*\]|\([^)]*\)|"[^"]*"),?|,
并替换为:

"$1 "

像这样尝试正则表达式:

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);
    }
}
下面的代码也适用于单引号和花括号

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

String[]arr=s.split((,(![\\w,]+[^,\\w]))|((?我在这里用空格替换了逗号(),{},[],“”,“”非常感谢@vks,这很好,但是如果逗号在单引号和花括号中,它就可以替换逗号,就像输入是'ad,cd,ef',ad,{fg,ef,rg}输出是'ac cd ef'ad{fg ef rg}@user3607869您可以发布失败的示例吗?abc、[def、ghi、ijk]、lm、{no、pq、rs}、[tu、vw、xy]、zs,“as、as、fr、ghhh",'gf,ef,rd'在这个逗号内',花括号也被替换为空格。非常感谢@Avinash Raj的详细解释,这就像gangbusters一样工作,我添加了对单引号的支持,这在这种情况下是不必要的。是的,你可以在上面的正则表达式中添加任意数量的块。是的,它被称为非捕获组.
()
称为捕获组,它捕获那些与该组中存在的模式匹配的字符。然后,我们可以通过反向引用来引用这些捕获的字符。但是,非捕获组与捕获组的操作相同,但它不会捕获任何字符。如果我们只想进行匹配,则将使用非捕获组够了。请看,是的,我们已经匹配了块,但是
[^”[{}()]
最后有助于匹配块外的所有字符。感谢大家提供的不同方法
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);
    }
}
abc
[def,ghi,ijk]
lm
(no,pq,rs)
[tu,vw,xy]
zs
"as,as,fr"
xyz
pqr
String[] arr = s.split("(,(?![\\w,]+[^,\\w]))|((?<=[^,\\w]),)");