Я пытаюсь разобрать (в Ruby), что фактически представляет собой файл формата passwd в UNIX: разделители-запятые с escape-символом \
, так что все, что экранировано, должно рассматриваться буквально. Я пытаюсь использовать для этого регулярное выражение, но у меня ничего не получится - даже при использовании Oniguruma для утверждений «lookahead / lookbehind».
По сути, все следующее должно работать:
a,b,c # => ["a", "b", "c"]
\a,b\,c # => ["a", "b,c"]
a,b,c\
d # => ["a", "b", "c\nd"]
a,b\\\,c # => ["a", "b\,c"]
Есть идеи?
Первый ответ выглядит довольно хорошо. С файлом, содержащим
\a,,b\\\,c\,d,e\\f,\\,\
g
это дает:
[["\\a,"], [","], ["b\\\\\\,c\\,d,"], ["e\\\\f,"], ["\\\\,"], ["\\\ng\n"], [""]]
что довольно близко. Мне не нужно делать экскаватор на этом первом проходе, если все разделено на запятые. Я попробовал Oniguruma и закончил с (гораздо дольше):
Oniguruma::ORegexp.new(%{
(?: # - begins with (but doesn't capture)
(?<=\A) # - start of line
| # - (or)
(?<=,) # - a comma
)
(?: # - contains (but doesn't capture)
.*? # - any set of characters
[^\\\\]? # - not ending in a slash
(\\\\\\\\)* # - followed by an even number of slashes
)*?
(?: # - ends with (but doesn't capture)
(?=\Z) # - end of line
| # - (or)
(?=,)) # - a comma
},
'mx'
).scan(s)