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

Tam*_*ake 2 regex perl specifications

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

如果不这样,是否所有perl正则表达式文字都有任何语言的规范?

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

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

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

ike*_*ami 5

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

例如,在

/$x{ EXPR }/
Run Code Online (Sandbox Code Playgroud)

s// EXPR /e
Run Code Online (Sandbox Code Playgroud)

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+/
Run Code Online (Sandbox Code Playgroud)

笔记:

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