2012-12-03 24 views
-1

可能重复:
Split Ruby regex over multiple lines红宝石正则表达式,拆分到多发线

如果我有红宝石一个很长的正则表达式,如何将其分成多个行,使之更可读?

有没有简单的方法来做到这一点?

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

你可以在这里发布你的正则表达式,以便我们可以在其上工作吗? –

+0

http://stackoverflow.com/questions/3762183/split-ruby-regex-over-multiple-lines –

回答

1

我可以想出三种方法让代码更具可读性。使用方法:

  1. 修改器/x并添加注释#
  2. 内嵌注释(?#comment_here)修饰符。
  3. 命名组;例如:(?<year>\d{2,4})对于事后引用或操作值非常有用。

的更多信息: http://www.ruby-doc.org/core-1.9.3/Regexp.html

0

除了使用在其他的答案中提到/x,创造了件正则表达式,然后逐步将它们结合起来可以让你小,原子大小的块慢慢地开始,然后增长正则表达式。你会看到这样一些庞大的模式,如那些用于解析电子邮件地址,互联网网址做,等

例如,这是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