是否有一个perl正则表达式形式的规范可以匹配所有perl正则表达式文字?
如果做不到这一点,有没有针对所有perl正则表达式文字的任何语言的规范?
理想情况下,它应该包括像/x这样的正则表达式修饰符和像s/这样的正则表达式运算符,但我可以稍后对其进行补充。
在变量插值之后匹配的规格是理想的,但之前的规格也很好。
上下文:我正在用perl (实际上是使用Parse::RecDescent)编写一种元语言,它可以编译成perl,并希望标识正则表达式文字并将它们传递给perl。
发布于 2011-08-03 07:13:23
这些操作符可以包含任意的Perl代码,并且没有相应的规范。
例如,在
/$x{ EXPR }/和
s// EXPR /eEXPR几乎可以是任何有效的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+/备注:
'»作为分隔符处理。\»作为分隔符,但我认为您不应支持此操作。发布于 2011-08-03 06:56:22
您可能需要查看YAPE::Regex的源代码,它用于解析Perl正则表达式。一个很大的警告是,它自perl版本5.6以来就没有更新过,这意味着它不理解从那时起引入的任何正则表达式语法(特别是5.10)。
另请参阅perlreref
https://stackoverflow.com/questions/6918678
复制相似问题