我需要帮助从sprockets解码这个正则表达式。我不确定这是什么匹配,但如果有人给我一些提示或起点。
HEADER_PATTERN = /
\A (
(?m:\s*) (
(\/\* (?m:.*?) \*\/) |
(\#\#\# (?m:.*?) \#\#\#) |
(\/\/ .* \n?)+ |
(\# .* \n?)+
)
)+
/x
答案 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
修饰符,因此忽略模式中#
之后的空格,换行符和任何文本(这就是为什么它跨多行编写)。这只是为了便于阅读。