2015-02-18 3 views
2

Для данной входной строки 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, он заменит запятые, которые не находятся внутри(), но выход не будет содержать содержимое внутри()

Любая помощь высоко ценится

+0

я заменил с пространством здесь – user3607869

+0

Запятая не должны быть заменены внутри(), {}, [],»»,»" – user3607869

ответ

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

Это должно работать нормально для you.the опережающего просмотра удостоверится , не между скобкой или quotes.See демо.

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

Для Java escape \ again.make it \\

Или, если вы можете жить с некоторыми дополнительными пробелами. попробуйте

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

Заменить $1 .Увидь демо.

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

+0

Thankyou так много @vks, это отлично работает, но оно заменяет запятую, если она находится внутри одной кавычки и цветочных фигурных скобок, например, если вход является результатом «ad, cd, ef», ad, {fg, ef, rg} «ac cd ef», ad {fg ef rg} – user3607869

+0

@ user3607869 Вы можете опубликовать пример, где он не работает? – vks

+0

abc, [def, ghi, ijk], lm, {no, pq, rs}, [tu, vw, xy], zs, "as, as, fr, ghhh", 'gf, ef, rd' в этом запятая внутри '' и цветочные брекеты также заменены пробелом – user3607869

3

Используйте регулярное выражение ниже, а затем заменить совпадающую с запятой в пространстве.

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

ИЛИ

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

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} 

Explanat иона:

  • , Матчи все запятые

  • ,(?=, только если за ним следует,

  • "[^\["(){}\]]*" А двойные кавычки блок, как "foo,bar"

  • | ИЛИ

  • \([^\["{}()\]]*\) paranthesis блок, как (foo,bar)

  • | ИЛИ

  • \[[^\["{}()\]]*\] квадратный блок кронштейн, как [foo,bar]

  • | ИЛИ

  • \{[^\["(){}\]]*} фигурной скобки блок, как {foo,bar}

  • | ИЛИ

  • [^"\[{}()\]] Любой символ, но не " или ( или ) или { или [ или ] или }.

  • Ноль или более раз. Это относится ко всему, то есть как (foo,bar) может повторяться ноль или более раз.

  • $ Вслед за концом линейного якоря.

+0

Спасибо, большое спасибо @Avinash Raj за подробное объяснение, это работает как gangbusters, я добавил поддержку для одной цитаты также – user3607869

+0

yep, это не обязательно для этого случая. Да, вы можете добавить любое количество блоков в вышеупомянутое регулярное выражение. –

+0

yep, это называется не захватывающей группой. '()' называется группой захвата, которая захватывает те символы, которые соответствуют шаблону, присутствующему внутри этой группы. Затем мы могли бы ссылаться на эти захваченные символы через обратную ссылку. Но группа, не связанная с захватом, делает то же самое, что и захват, но не будет захватывать никаких символов. Если мы хотим выполнить сопоставление, тогда будет недостаточно группы без кавычек. см. https://regex101.com/r/zB3hI5/19 и https://regex101.com/r/zB3hI5/20 –

1

Здесь представлено более простое регулярное выражение.Матч это регулярное выражение:

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

И заменить:

"$1 " 

RegEx Demo

+1

Спасибо всем за подходы diff – user3607869

0

Постарайся Regex как это:

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]),)"); 
Смежные вопросы