-1

重複の可能性:
Ruby 正規表現を複数行に分割する

Ruby で非常に長い正規表現を使用している場合、複数行に分割して読みやすくするにはどうすればよいですか?

これを行う簡単な方法はありますか?

      line.regexp = /^([^\ ]+) ([^\ ]+) \[(#{timestamp('%d/%b/%Y:%H:%M:%S %z')})?\] (#{ip_address}) ([^\ ]+) ([^\ ]+) (\w+(?:\.\w+)*) ([^\ ]+) "([^"]+)" (\d+) ([^\ ]+) (\d+) (\d+) (\d+) (\d+) "([^"]*)" "([^"]*)"/
4

3 に答える 3

3

/xフリースペースモードを示す修飾子を使用する必要があります。詳細については、http://www.regular-expressions.info/freespacing.htmlをご覧ください。

于 2012-12-03T20:04:15.180 に答える
1

コードを読みやすくする方法は 3 つあります。使用する:

  1. /x修飾子と でコメントを追加します#
  2. (?#comment_here)修飾子を使用したインライン コメント。
  3. 名前付きグループ。例:(?<year>\d{2,4})後で値を逆参照または操作する場合に役立ちます。

詳細: http://www.ruby-doc.org/core-1.9.3/Regexp.html

于 2012-12-03T20:27:19.313 に答える
0

他の回答で言及されている使用に加えて/x、正規表現を断片的に作成し、それらを徐々に組み合わせることで、小さなアトミックサイズの断片から始めて、ゆっくりと正規表現を成長させることができます。これは、電子メール アドレスやインターネット URL などの解析に使用されるものなど、いくつかの巨大なパターンで行われていることがわかります。

たとえば、これは Ruby の OpenURI ソース コードからのものです。

RE_LWS = /[\r\n\t ]+/n
RE_TOKEN = %r{[^\x00- ()<>@,;:\\"/\[\]?={}\x7f]+}n
RE_QUOTED_STRING = %r{"(?:[\r\n\t !#-\[\]-~\x80-\xff]|\\[\x00-\x7f])*"}n
RE_PARAMETERS = %r{(?:;#{RE_LWS}?#{RE_TOKEN}#{RE_LWS}?=#{RE_LWS}?(?:#{RE_TOKEN}|#{RE_QUOTED_STRING})#{RE_LWS}?)*}n

RE_PARAMETERS次のように解決されます。

/(?:;(?-mix:[\r\n\t ]+)?(?-mix:[^\x00- ()<>@,;:\\"\/\[\]?={}\x7f]+)(?-mix:[\r\n\t ]+)?=(?-mix:[\r\n\t ]+)?(?:(?-mix:[^\x00- ()<>@,;:\\"\/\[\]?={}\x7f]+)|(?-mix:"(?:[\r\n\t !#-\[\]-~\x80-\xff]|\\[\x00-\x7f])*"))(?-mix:[\r\n\t ]+)?)*/n
于 2012-12-03T21:05:08.810 に答える