Регулярное выражение для соответствия запятой, которая не заключена в кавычки - PullRequest
5 голосов
/ 23 апреля 2010

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

Вот пример строки:

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

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

Если я не очень хорошо понимаю, пожалуйста, спросите, и я с радостью что-нибудь проясню.

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

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

Строка: {:a 3, :b 3,} <- каждая запятая соответствует. </p>

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

1 Ответ

18 голосов
/ 23 апреля 2010

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

,\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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...