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

时间:2011-08-02 21:12:44

标签: regex perl specifications

是否有perl正则表达式形式的规范将匹配所有perl正则表达式文字?

如果失败了,是否所有perl正则表达式文字都有任何语言规范?

理想情况下,它应该包含正则表达式修饰符,如/x和正则表达式运算符,如s/,但我可以稍后解决这些问题。

变量插值后匹配的规格是理想的,但之前也很好。

上下文:我正在使用perl(实际上,使用Parse :: RecDescent)编写一个编译成perl的元语言,并希望识别正则表达式文字并将它们传递给perl。

2 个答案:

答案 0 :(得分:5)

这些运算符可以包含任意Perl代码,并且没有规范。

例如,在

/$x{ EXPR }/

s// EXPR /e

EXPR几乎可以是任何有效的Perl表达式。

但是,我认为你实际上不需要知道如何解析它。你只需要知道它的结束位置。这很容易。 Perl还需要能够在解析运算符之前执行此操作,因此它不允许某些代码模式。 (因此“几乎”在上面。)

  • 任何出现的分隔符都必须以奇数“\”开头。

  • 作为上述例外情况,当分隔符为()[]{}时,只要分隔符平衡,分隔符就可以显示未转义。

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+/

注意:

  • 规则可能无法正确处理«'»作为分隔符。
  • 需要添加规则以允许“\”作为分隔符,但我认为您不应该支持该规则。

答案 1 :(得分:2)

您可能希望查看YAPE::Regex的源代码,该代码用于解析Perl正则表达式。一个重要的警告是,自perl 5.6版本以来它没有更新,这意味着它不理解从那时起引入的任何正则表达式语法(尤其是5.10)。

另见perlreref