2011-07-18 13 views
3

我使用很長的正則表達式,是相當困難的,如果你沒有在前面的5分鐘內寫神交 -代碼格式化 - 減輕無法識別的大型正則表達式的方法?

"/([^\s]+)\s*[^\[]+\[([^\]]+)\]\s*"([^\s]+)\s*([^\s]+)\s*([^"]+)"\s*([^\s]+)\s*([^\s]+)   \s*"([^"]+)"\s*"([^"]+)"/ 

是否有代碼格式化長的正則表達式的一個普遍採用的方式,使更好的可讀性?

我想過把每個捕獲組自身的線,例如

  /([^\s]+) 
\s*[^\[]+\[([^\]]+) 
    \]\s*"([^\s]+) 
     \s*([^\s]+) 
     \s*([^"]+) 
     "\s*([^\s]+) 
     \s*([^\s]+) 
     \s*"([^"]+) 
     "\s*"([^"]+)"/ 

這將是極好的,如果我可以把註釋行通過正則表達式的每個部分線路,但紅寶石不會讓我。

我對使用大正則表達式處理的一般問題比對解析文本的更好方法更感興趣......這個特殊情況只是我在學習一些Ruby時自己設定的練習的一部分。

回答

2

只需使用x標誌(這意味着忽略空格)。

然後,你也可以把意見。見例如:

  /([^\s]+) #Matches 1+ not whitespace. 
\s*[^\[]+\[([^\]]+) #Matches 0+whitespace and an open bracket "[" 
    \]\s*"([^\s]+) #Matches a closing brack, space and and an open ", and some text 
     \s*([^\s]+) #Matches 
     \s*([^"]+) 
     "\s*([^\s]+) 
     \s*([^\s]+) 
     \s*"([^"]+) 
     "\s*"([^"]+)"/x =~ 'ss[s] "ss" " " dd dd "sdf" " df"sdfasdf'   

print Regexp.last_match #=> ss[s] "ss" " " dd dd "sdf" " df" 

參見:http://codepad.org/PDSxQUQf

+0

是不是嚴格意義上講找一個Ruby的答案,但會做:) – iftheshoefritz

+0

的'x'標誌忽略空白應該適用於大多數所有正則表達式引擎。例如perl:http://codepad.org/drD1QRiA –

+0

好棒 - 感謝您的提示! – iftheshoefritz

1

您可以使用此:

class Regexp 
    def +(re) 
     Regexp.new self.source + re.source 
    end 
end 

,使 '+' 運算符來連接正則表達式的表達式:

  /([^\s]+)/ + # Comment 
/\s*[^\[]+\[([^\]]+)/ + # Comment 
    /\]\s*"([^\s]+)/ + # Comment 
     /\s*([^\s]+)/ + # Comment 
     /\s*([^"]+)/ + # Comment 
     /"\s*([^\s]+)/ + # Comment 
     /\s*([^\s]+)/ + # Comment 
     /\s*"([^"]+)/ + # Comment 
     /"\s*"([^"]+)"/ # Comment 
1

正如其他張貼,我通常設置標誌忽略模式空白。 除了允許多行正則表達式和意見,它可以讓你的邏輯分組或功能您正則表達式分開。

例子:

/([^\s]+) 
\s* [^\[]+ \[ ([^\]]+) \] 
\s*   " ([^\s]+) \s* ([^\s]+) \s* ([^"]+) " 
\s*    ([^\s]+) \s* ([^\s]+) 
\s*   " ([^"]+) " 
\s*   " ([^"]+) "/ 

結構可以使世界上所有的差異,有時甚至比評論更多。當爲了可讀性而編寫時,表達式的佈局應該像表達式本身一樣反映它的目的。否則,不管你的評論說什麼,閱讀都會很痛苦。

它也可以幫助你已經繼承了表達式做到這一點,因爲事情真的會在你跳出來。 (我不知道你是配對引號或括號,直到我創建的上述爲例)

相關問題