Perl正则表达式匹配Perl正则表达式文字



是否存在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)。

参见

最新更新