Хотя я подозреваю, что, возможно, все еще есть способ сделать это с помощью регулярных выражений, вы также можете сделать это с помощью простого анализа строки.
Найдите все запятые в строке, а затем переходите вперед или назад от этой точки(не имеет значения, какие, если скобки сбалансированы правильно), добавив одну для открытой скобки и вычитая одну для закрытой скобки.Если у вас нет 0 в конце, вы находитесь внутри фигурной скобки, поэтому вам не нужна запятая.
Разделите все остальные запятые.
РЕДАКТИРОВАТЬ
Хотя комментарий о сбое этой методологии в случае скобок, заключенных в запятые, действителен, возможно, вы имеете дело с запросами, достаточно простыми, чтобы не беспокоиться об этом.Если это так, это должно работать:
def in_brackets(str,pos)
cnt = 0
str[pos,str.length].each_char do |c|
if c == '('
cnt += 1
elsif c == ')'
cnt -= 1
end
end
return cnt != 0
end
def split_on_some_commas(str)
offset = -1
split_pts = []
while (offset = str.index(",",offset+1))
if !in_brackets(str,offset)
split_pts << offset
end
end
split_pts << str.length
pos = 0
ret = []
split_pts.each do |pt|
ret << str[pos..(pt-1)].strip
pos = pt+1
end
return ret
end
puts split_on_some_commas("SUBSTRING('test',1,3) ASC, SUBSTRING('test2', 2,2 ) DESC, SUBSTRING('test2', 2,2 ) DESC").inspect