2012-12-03 3 views
-1

Можно создать дубликат:
Split Ruby regex over multiple linesрубин регулярное выражение, расщепление на Mutiple линий

Если у меня есть очень длинный регулярное выражение в рубин, как я разделить его на несколько строк, чтобы сделать его более удобочитаемый?

Есть ли простой способ сделать это?

 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-multiplelines –

ответ

1

Я могу представить три способа сделать ваш код более читаемым. Использование:

  1. Редактор /x и добавьте свои комментарии с #.
  2. Встроенные комментарии с модификатором (?#comment_here).
  3. Именованные группы; Например: (?<year>\d{2,4}) полезен для обратного или манипулирования значениями впоследствии.

Дополнительная информация: http://www.ruby-doc.org/core-1.9.3/Regexp.html

0

Помимо использования /x упомянутых в других ответах, создавая регулярное выражение на части, а затем постепенно их объединение позволяет начать с небольшими атомными размерами кусков, а затем медленно вырастите регулярное выражение. Вы увидите, что это сделано с некоторыми огромными узорами, такие как те, которые используются для разбора адреса электронной почты, интернет-адрес и т.д.

Например, это из исходного кода 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 
Смежные вопросы