2010-06-22 61 views
1

我試圖將SQL查詢的ORDER BY語句拆分爲數組。第一個傾向是:將ORDER BY語句拆分爲數組

order_by.split(',') 

但是,這並不對ORDER BY語句,如以下工作:

SUBSTRING('test',1,3) ASC, SUBSTRING('test2', 2,2) DESC 

對於上述說法所需的輸出將是:

["SUBSTRING('test',1,3) ASC", "SUBSTRING('test2', 2,2) DESC"] 

我相當肯定的是,如果我能夠匹配任何不含糊不清的逗號,它就會工作,但我無法在ruby正則表達式中找到這樣做的方法,因爲不支持lookbehind。

回答

0

雖然我懷疑可能還有一種方法可以用正則表達式來實現,但也可以使用簡單的字符串解析來完成。

查找字符串中的所有逗號,然後從該點開始向前或向後(如果括號平衡正確,則無關緊要),爲開放大括號添加一個,爲大括號添加一個。如果你最後沒有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 
+0

嗯,這樣做的工作,我希望有一些更簡潔的東西。但我相信這是最好的方法。謝謝! – 2010-06-22 12:30:12

1

最簡單的方法是做一個preg_replace_callback有佔位符替換括號,然後爆炸的數據,然後通過循環,把括號後面。

0

通常,您不能使用正則表達式來解析非常規語言。

嘗試使用Rockit爲您需要的SQL子集創建真正的語法和解析器。