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,它将替换不在()内的逗号,但输出内容将不在()内
非常感谢您的帮助
,(?![^\[({]*[\])}])(?![^"']*["'](?:[^"']*["'][^"']*["'])*[^"']*$)
这对您来说应该很好。前瞻将确保,
不在括号或引号之间。请参阅演示
对于javaescape\再次。使其成为\\
或者,如果你可以住在一些额外的空间。试一试
(['"(\[{].*?['")}\]])|,
替换为$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]),)");