[英]Replace the commas which are not inside parenthesis,quotes
output should be 對於給定的輸入字符串輸出應為
我嘗試了這個 說我的字符串是str,它將替換不在()內的逗號,但輸出在()內沒有內容
任何幫助都受到高度贊賞
使用下面的正則表達式,然后將匹配的逗號替換為空格。
,(?=(?:"[^\["(){}\]]*"|\([^\["{}()\]]*\)|\[[^\["{}()\]]*\]|\{[^\["(){}\]]*}|[^"\[{}()\]])*$)
要么
,(?=(?:"[^"]*"|\([^()]*\)|\[[^\[\]]*\]|\{[^{}]*}|[^"\[{}()\]])*$)
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"
|
要么
\\([^\\["{}()\\]]*\\)
如(foo,bar)
括號
|
要么
\\[[^\\["{}()\\]]*\\]
方括號,例如[foo,bar]
|
要么
\\{[^\\["(){}\\]]*}
一個大括號塊,例如{foo,bar}
|
要么
[^"\\[{}()\\]]
但不是"
或(
或)
或{
或[
或]
或}
任何字符。
零次或多次。 這適用於整體,就像(foo,bar)
可以重復零次或更多次。
$
之后是行錨的結尾。
,(?![^\[({]*[\])}])(?![^"']*["'](?:[^"']*["'][^"']*["'])*[^"']*$)
對您來說這應該工作正常。超前將確保,
不在括號或引號之間。請參閱演示。
https://regex101.com/r/jG2wO4/8
對於Java escape \\ again.make it \\\\
或者,如果您可以居住一些額外的空間。 嘗試
(['"(\[{].*?['")}\]])|,
替換為$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);
}
}
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]),)");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.