簡體   English   中英

替換不在括號內的逗號,引號

[英]Replace the commas which are not inside parenthesis,quotes

output should be 對於給定的輸入字符串輸出應為

  

我嘗試了這個 說我的字符串是str,它將替換不在()內的逗號,但輸出在()內沒有內容

任何幫助都受到高度贊賞

使用下面的正則表達式,然后將匹配的逗號替換為空格。

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

要么

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

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"

  • | 要么

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

  • | 要么

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

  • | 要么

  • \\{[^\\["(){}\\]]*}一個大括號塊,例如{foo,bar}

  • | 要么

  • [^"\\[{}()\\]]但不是"(){[]}任何字符。

  • 零次或多次。 這適用於整體,就像(foo,bar)可以重復零次或更多次。

  • $之后是行錨的結尾。

這是更簡單的正則表達式。 匹配此正則表達式:

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

並替換為:

"$1 "

正則演示

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

對您來說這應該工作正常。超前將確保,不在括號或引號之間。請參閱演示。

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

對於Java escape \\ again.make it \\\\

或者,如果您可以居住一些額外的空間。 嘗試

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

替換為$1參閱演示。

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

試試這樣的正則表達式:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM