2009-08-27 44 views
0

語言是紅寶石,這裏是我的IRB會議爲什麼我的正則表達式中的最後一個表達式連接到第一個表達式?

expr = /\Aselect from (\D+)(?: (?:where|&&) (\D+) (\S+) (\S+))*(?: order by (\D+) (asc|desc))?\Z/ 
=> /\Aselect from (\D+)(?: (?:where|&&) (\D+) (\S+) (\S+))*(?: order by (\D+) (asc|desc))?\Z/ 

/> str = "select from Entity order by value desc" 
=> "select from Entity order by value desc" 

/> expr =~ str 
=> 0 

/> $1 
=> "Entity order by value desc" 

/> $2 
=> nil 

我只是不明白,爲什麼我是「按價值遞減實體令」得到$ 1美元。這裏期望的行爲是獲得$ 1 =>「實體」,$ 2 =>「值」,$ 3 =>「desc」。我究竟做錯了什麼?我如何修改這個正則表達式,以便得到這些結果?

謝謝

回答

4

\ d是「非數字」,它涵蓋了下列詞語詞之間的空白,以及。嘗試(\ S +)來代替。

[編輯]抱歉,我錯過了最後的問題。以上回答'爲什麼會發生這種情況?',但不是'我如何實現我想要的?'。這裏有一種方法,繞過任何其他條款與*

/\Aselect from (\S+).*(?:order by (\S+) (asc|desc)?)?\Z/ 

由於SQL與間距相當自由,這樣的關鍵字之間,你可能想使它更不可讀,並使用\ S +,而不是字面空間。也就是說,表達,是將不匹配:

"select from  Fred" 

,但它將如果你沒有/ \ ASELECT \ S +從\ S + ....

1

(\D+)既貪婪又吃了字符串的其餘部分。由於表達式中的所有內容都是可選的(*或?),因此表達式無需匹配即可成功。

我的建議是讓你的比賽少貪心。例如(\D+?)將會匹配並捕獲任何非數字一次或多次,但是根據需要只需要幾次即可成功匹配。

相關問題