Мне нужно разделить строку запятыми, которые не встречаются в кавычках.Мой подход заключается в следующем:
- Заменить запятые в подстроках в кавычках специальным токеном,
- Разделить строку запятыми, затем
- Заменить вхождения токена назапятая (в разделенных строках).
Я понимаю, что, возможно, есть более простой способ сделать это, но теперь меня просто интересует, почему замена названной группы не работает, как яопишите ниже.
У меня есть регулярное выражение, которое идентифицирует запятые в подстроках в кавычках как именованный захват commahere
:
COMMA_INSIDE_QUOTES_REGEX = /
(?<quote>[\"\']) # start by finding either single or double quote
(?<postquote>.*?) # then lazy capture any other chars until...
(?<commahere>\,) # ...we find the comma
(?<postcomma>.*?) # then lazy capture any other chars until...
(\k<quote>) # ...we find the matching single or double quote
/x
В следующей тестовой строке регулярное выражение соответствует de,f
и вjk,a,l
но не другие, как я ожидаю.
str = 'abc,"de,f",ghi,"jk,a,l"'
COMMA_INSIDE_QUOTES_REGEX.match(str)
#=> #<MatchData "\"de,f\"" quote:"\"" postquote:"de" commahere:"," postcomma:"f">
Но когда я использую gsub
для замены именованных снимков специальным токеном, заменяется все совпадение, а не именованная группа (плюсеще две запятые!):
COMMA_TOKEN = '<--COMMA-->'
str.gsub(COMMA_INSIDE_QUOTES_REGEX,"\\k<commahere>#{COMMA_TOKEN}")
#=> "abc,,<--COMMA-->,ghi,,<--COMMA-->"