是否存在perl正则表达式形式的规范,该规范将匹配所有perl正则表达式文字?
如果做不到这一点,在任何一种语言中是否有针对所有perl正则表达式字面量的规范?
理想情况下,它应该包括像/x
这样的正则表达式修饰符和像s/
这样的正则表达式操作符,但我可以稍后添加它们。
在变量插值之后匹配的规格是理想的,但之前也可以。
上下文:我正在写perl(实际上,使用Parse::RecDescent)编译成perl的元语言,并希望识别正则表达式字面量并将其传递给perl。
这些操作符可以包含任意的Perl代码,并且没有相应的规范。
例如,在
/$x{ EXPR }/
和
s// EXPR /e
EXPR
几乎可以是任何有效的Perl表达式。
然而,我认为你实际上不需要知道如何解析它。你只需要知道它在哪里结束。这很简单。Perl在解析运算符之前也需要能够做到这一点,因此它不允许某些代码模式。(因此上面的"几乎"。)
任何分隔符必须在奇数"
"之前出现。
作为上述的一个例外,当分隔符为
()
,[]
或{}
时,只要分隔符是平衡的,它们就可以显示未转义。
& # x20的;
balanced_paren_guts : ( /(?:[^\()]|\.)+/ | '(' balanced_paren_guts ')' )(s?)
balanced_square_guts : ( /(?:[^\[]]|\.)+/ | '[' balanced_square_guts ']' )(s?)
balanced_curly_guts : ( /(?:[^\{}]|\.)+/ | '{' balanced_curly_guts '}' )(s?)
match_op : <skip:> 'm' /s*/ match_op_1 match_modifiers
match_op_1 : '(' <commit> balanced_paren ')'
| '[' <commit> balanced_square ']'
| '{' <commit> balanced_curly '}'
| /(?x: ([^\]) (?:(?!1).|\.)* 1 )/
match_modifiers : /w+/
subst_op : <skip:> 's' /s*/ subst_op_1 subst_modifiers
subst_op_1 : '(' <commit> balanced_paren ')' s* subst_op_2
| '[' <commit> balanced_square ']' s* subst_op_2
| '{' <commit> balanced_curly '}' s* subst_op_2
| /(?x: ([^\]) (?:(?!1).|\.)* 1 (?:(?!1).|\.)* 1 )/
subst_op_2 : '(' <commit> balanced_paren ')'
| '[' <commit> balanced_square ']'
| '{' <commit> balanced_curly '}'
| /(?x: ([^\]) (?:(?!1).|\.)* 1 )/
subst_modifiers : /w+/
指出:
- 规则可能无法正确处理«
'
»作为分隔符。 - 需要添加一个规则来允许«
»作为分隔符,但我认为你不应该支持。
您可能想要查看YAPE::Regex的源代码,它用于解析Perl正则表达式。一个很大的警告是,它自perl 5.6版本以来就没有更新过,这意味着它不理解自那以后引入的任何正则表达式语法(特别是5.10)。
参见