2017-10-19 83 views
1

要找出哪個提交的SQL查詢與LIMIT子句結束,我使用正則表達式如下較短的正則表達式:是有這種模式

re_end_has_limit = re.compile(
    r'LIMIT\s+(\d+|\(\d+\)|\(\s+\d+\)|\(\s+\d+\s+\))($|;$|\s+;$|\s+;\s+$)', 
    re.IGNORECASE) 

這符合以下&按預期工作。它匹配以下:

LIMIT 1 
LIMIT (1) 
LIMIT (1) 
LIMIT 1; 
LIMIT (1); 
LIMIT (1); 
LIMIT 1 ; 
LIMIT (1) ; 
LIMIT (1) ; 
LIMIT 1 ; 
LIMIT (1) ; 
LIMIT (1) ; 

注意:最後3項中包含一個尾隨空格字符。

然而,看着正則表達式,我覺得有一種方法可以縮短它,但一直沒有弄清楚。

+3

您可能想了解'*'和'?'。另外,你的正則表達式不匹配'LIMIT(1)'。 – melpomene

+0

感謝,在瞭解'*'之後,我得到了'pattern = r'LIMIT(\ s + \ d + | \ s * \(\ s * \ d + \ s * \))\ s *(; \ s * $ | $)'',在瞭解了'?'後,我達到了接受的答案。 –

回答

1

如何:

LIMIT(\s+\d+|\s*\(\s*\d+\s*\))\s*;?\s*$ 
-1

我不熟悉SQL查詢,但看你的例子,我認爲這應該努力找到所有LIMIT子句:

re_end_has_limit = re.compile(r'LIMIT[ \(]+\d', re.g) 
+0

@melpomene:我已更正了與您的新示例不匹配的答案。 – mrCarnivore

+0

匹配'SELECT'SKY是LIMIT(1 2 3)'FROM DUAL'。 – melpomene

+0

我放棄了......這些限制從原來的問題來看並不明顯!此外,其他答案無法正常工作,當在regex101上嘗試它們時... – mrCarnivore

0

這也是一種選擇:

LIMIT\s*(\()?\s*\d+\s*(?(1)\))\s*;?\s*$ 

regex101

而不是使用或(|),就像接受的答案一樣,它使用if((?(1)...)