2011-07-18 3 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は私をさせません。

私は大文字の方がテキストを解析するよりも大きな正規表現を使うのが一般的な質問にもっと興味を持っています...この特定のケースは、私が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" 

参照:正規表現式を連結するには '+' 演算子を有効にするには

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

http://codepad.org/PDSxQUQf

+0

厳密にはRubyの答えを探していませんでしたが、それは役に立ちます:) – iftheshoefritz

+0

空白を無視する 'x'フラグほとんどすべての正規表現エンジンで動作するはずです。例えばperl:http://codepad.org/drD1QRiA –

+0

すごくおいしいです - チップをありがとう! – iftheshoefritz

1

あなたがこれを使用することができ

  /([^\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*   " ([^"]+) "/ 

構造は、時にはよりコメントよりも、世界のすべての違いを作ることができます。読みやすさのために書くときは、式のレイアウトは式自体と同じくらい目的を反映する必要があります。さもなければ、あなたのコメントが何を言っても、読むのは苦痛でしょう。

これは、継承した式の場合にも役立ちます。これは、物事が本当に飛び出すためです。 (例えば、上記のように作成するまで引用符や括弧をペアにしていたとは思いませんでした)