2010-04-23 2 views
5

Я использую Clojure, так что это в контексте регулярных выражений Java.Регулярное выражение для запятой, которая не окружена кавычками

Ниже приведен пример строки:

{:a "ab,cd, efg", :b "ab,def, egf,", :c "Conjecture"} 

важные биты являются запятые после каждой строки. Я хотел бы иметь возможность заменить их символами новой строки с помощью метода replaceAll Java. Регулярное выражение, которое будет соответствовать , будет содержать любую запятую, которая не окружена кавычками.

Если я плохо знаком, спросите меня, и я буду счастлив прояснить что-нибудь.

Редактировать: извините за путаницу в названии. Я не проснулся очень долго.

Строка: {:a "ab, cd efg",} < - В этом примере запятая в конце будет соответствовать, но те, что внутри цитаты, не будут.

String: {:a 3, :b 3,} < - Каждая спичка соответствует запятой.

String {:a "abcd,efg" :b "abcedg,e"} < - Каждая запятая не совпадает.

+0

Вы можете добавить пример, где каждая запятая совпадает, и та, где каждая отдельная запятая не соответствует – mkoryak

ответ

18

регулярное выражение:

,\s*(?=([^"]*"[^"]*")*[^"]*$) 

совпадений:

{:a "ab,cd, efg", :b "ab,def, egf,", :c "Conjecture"} 
       ^    ^
       ^    ^

и:

{:a "ab, cd efg",} 
       ^
       ^

и не соответствуют запятой в:

{:a "abcd,efg" :b "abcedg,e"} 

Но когда сбежавшие котировки могут появиться, например, так:

{:a "ab,\" cd efg",} // only the last comma should match 

, то регулярное выражение решение не будет работать.

Краткое объяснение регулярных выражений:

,   # match the character ',' 
\s*   # match a whitespace character: [ \t\n\x0B\f\r] and repeat it zero or more times 
(?=   # start positive look ahead 
    (   # start capture group 1 
    [^"]* #  match any character other than '"' and repeat it zero or more times 
    "  #  match the character '"' 
    [^"]* #  match any character other than '"' and repeat it zero or more times 
    "  #  match the character '"' 
)*   # end capture group 1 and repeat it zero or more times 
    [^"]*  # match any character other than '"' and repeat it zero or more times 
    $   # match the end of the input 
)   # end positive look ahead 

Другими словами: соответствовать любой запятой, которая имеет ноль или четное число цитат впереди него (до конца строки).

+0

Похоже, вы сделали противоположное тому, что я хотел. : p Я хочу совместить запятые, что/нет/в строке. :) – Rayne

+0

Ах, поскольку вы не избежали цитат внутри своей строки, я предположил, что первая и последняя цитата также были частью вашего литерала. Мое регулярное выражение все еще правильно, кстати. См. Мое редактирование. –

Смежные вопросы