我需要帮助从sprockets解码这个正则表达式

时间:2012-01-18 22:09:01

标签: regex ruby-on-rails-3 sprockets

我需要帮助从sprockets解码这个正则表达式。我不确定这是什么匹配,但如果有人给我一些提示或起点。

HEADER_PATTERN = /
\A (
  (?m:\s*) (
   (\/\* (?m:.*?) \*\/) |
   (\#\#\# (?m:.*?) \#\#\#) |
   (\/\/ .* \n?)+ |
   (\# .* \n?)+
  )
 )+
/x

2 个答案:

答案 0 :(得分:3)

HEADER_PATTERN = /
\A (                             # Start of string
  (?m:\s*) (                     # Match optional whitespace
   (\/\* (?m:.*?) \*\/) |        # Either match /* (any characters, lazily) */
   (\#\#\# (?m:.*?) \#\#\#) |    # or ### (any characters, lazily) ###
   (\/\/ .* \n?)+ |              # or // (any characters except newlines) until optional newline (one or more)
   (\# .* \n?)+                  # or # (any characters except newlines) until optional newline (one or more)
  )
 )+                              # once or more
/x

(?m:...)允许此子表达式中的点也匹配换行符,这通常不会。 (这是Ruby专业;几乎所有其他正则表达式都使用(?s:...)来实现)

所以看起来这个正则表达式匹配文件/字符串开头的块注释或行注释。

答案 1 :(得分:2)

\A

锚定到字符串的开头

(

启动一个包装整个字符串的组。它以)+结尾,因此匹配1个或更多实例。

(?m:\s*)

打开此原子的多行标记,并匹配零个或多个“空格”字符(例如空格,垂直制表符,水平制表符,换行符或回车符)。我不知道为什么他们在这里打开多行标志,因为这不会影响\s转义。

(\/\* (?m:.*?) \*\/)

第一位\//字符匹配(转义,因为/是正则表达式的分隔符)。 \**字符匹配。由于x修饰符,可以忽略该空格。然后,它会再次打开.*?的多行标记,这会使.与新行匹配。这里?使*修饰符不贪婪,因此它匹配任何字符,但只有少数才能使模式的其余部分匹配。然后是*/。换句话说,它匹配C风格的评论(/* text */

|

(\#\#\# (?m:.*?) \#\#\#)

匹配###所包围的任何文字,例如### something ###。再次使用带有.的多线修改器,以及非贪婪匹配,以便在###匹配时立即停止匹配。由于#修饰符,x个字符会被转义。

|

(\/\/ .* \n?)+

匹配//,后跟任何文字,后跟可选的换行符。我想换行是可选的,如果这是字符串的结尾。缺少多行修饰符会导致.与换行符不匹配。这基本上匹配//后跟任何内容,直到行尾。

|

(\# .* \n?)+

匹配#,后跟任何文字,后跟可选的换行符。与之前的模式相同,但使用#而不是//。请注意,较早的###模式优先,因为它较早,因此如果文本与###模式匹配,则不会与此模式匹配。

最后,整个事情使用x修饰符,因此忽略模式中#之后的空格,换行符和任何文本(这就是为什么它跨多行编写)。这只是为了便于阅读。