Regex 我需要帮助从链轮解码这个正则表达式

Regex 我需要帮助从链轮解码这个正则表达式,regex,ruby-on-rails-3,sprockets,Regex,Ruby On Rails 3,Sprockets,我需要帮助从链轮解码这个正则表达式。我不确定这符合什么,但如果有人给我一些提示或起点 HEADER_PATTERN = / \A ( (?m:\s*) ( (\/\* (?m:.*?) \*\/) | (\#\#\# (?m:.*?) \#\#\#) | (\/\/ .* \n?)+ | (\# .* \n?)+ ) )+ /x (?m:…)允许此子表达式中的点也匹配通常不匹配的换行符。(这是Ruby的特色;几乎所有其他正则表达式都使用(?s:…)) 因此,这

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

HEADER_PATTERN = /
\A (
  (?m:\s*) (
   (\/\* (?m:.*?) \*\/) |
   (\#\#\# (?m:.*?) \#\#\#) |
   (\/\/ .* \n?)+ |
   (\# .* \n?)+
  )
 )+
/x
(?m:…)
允许此子表达式中的点也匹配通常不匹配的换行符。(这是Ruby的特色;几乎所有其他正则表达式都使用
(?s:…)

因此,这个正则表达式似乎匹配文件/字符串开头的块注释或行注释

\A
(?m:…)
允许此子表达式中的点也匹配通常不匹配的换行符。(这是Ruby的特色;几乎所有其他正则表达式都使用
(?s:…)

因此,这个正则表达式似乎匹配文件/字符串开头的块注释或行注释

\A
锚定到字符串的开头

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

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

(\/\* (?m:.*?) \*\/)
第一位
\/
/
字符匹配(转义,因为
/
是正则表达式的分隔符)<代码>\*与
*
字符匹配。由于使用了
x
修饰符,因此可以忽略空格。然后它再次为
*?
打开多行标志,使
匹配换行符。这里的
使
*
修饰符不贪婪,因此它匹配任何字符,但只匹配使其余模式匹配所需的数量。接着是一个
*
,和一个
/
。换句话说,它与C风格的注释相匹配(
/*text*/

匹配由
####
包围的任何文本,例如
######
。再次将多行修饰符与
一起使用,并使用非贪婪匹配,以便在
匹配某个内容时停止匹配。由于使用了
x
修饰符,因此对
#
字符进行了转义

匹配
/
,后跟任意文本,后跟可选换行符。我想换行符是可选的,以防这是字符串的结尾。缺少多行修改器使得
与换行符不匹配。这基本上与
/
匹配,后跟任何内容,直到行尾

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

最后,整个过程都使用了
x
修饰符,因此模式中的空格、换行符和
#
之后的任何文本都将被忽略(这就是它跨多行写入的原因)。这只是为了可读性

锚定到字符串的开头

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

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

(\/\* (?m:.*?) \*\/)
第一位
\/
/
字符匹配(转义,因为
/
是正则表达式的分隔符)<代码>\*与
*
字符匹配。由于使用了
x
修饰符,因此可以忽略空格。然后它再次为
*?
打开多行标志,使
匹配换行符。这里的
使
*
修饰符不贪婪,因此它匹配任何字符,但只匹配使其余模式匹配所需的数量。接着是一个
*
,和一个
/
。换句话说,它与C风格的注释相匹配(
/*text*/

匹配由
####
包围的任何文本,例如
######
。再次将多行修饰符与
一起使用,并使用非贪婪匹配,以便在
匹配某个内容时停止匹配。由于使用了
x
修饰符,因此对
#
字符进行了转义

匹配
/
,后跟任意文本,后跟可选换行符。我想换行符是可选的,以防这是字符串的结尾。缺少多行修改器使得
与换行符不匹配。这基本上与
/
匹配,后跟任何内容,直到行尾

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


最后,整个过程都使用了
x
修饰符,因此模式中的空格、换行符和
#
之后的任何文本都将被忽略(这就是它跨多行写入的原因)。这只是为了可读性。

@TimPietzcker:是的,但是第一个原子是
(?m:\s*)
,它没有点。我在
(?m:…)
的第二个用法中提到,多行标志使
匹配换行符,这在这里是有意义的,但是
\s*
不受此标志的影响。@TimPietzcker:是的,但是第一个原子是
(?m:\s*)
,它没有点。我在
(?m:…)
的第二个用法中提到了多行标志
(\/\/ .* \n?)+
|
(\# .* \n?)+