是否有perl正则表达式形式的规范将匹配所有perl正则表达式文字?
如果失败了,是否所有perl正则表达式文字都有任何语言规范?
理想情况下,它应该包含正则表达式修饰符,如/x
和正则表达式运算符,如s/
,但我可以稍后解决这些问题。
变量插值后匹配的规格是理想的,但之前也很好。
上下文:我正在使用perl(实际上,使用Parse :: RecDescent)编写一个编译成perl的元语言,并希望识别正则表达式文字并将它们传递给perl。
答案 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)。