首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >匹配Perl正则表达式文字的perl正则表达式

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

Stack Overflow用户
提问于 2011-08-03 05:12:44
回答 2查看 252关注 0票数 2

是否有一个perl正则表达式形式的规范可以匹配所有perl正则表达式文字?

如果做不到这一点,有没有针对所有perl正则表达式文字的任何语言的规范?

理想情况下,它应该包括像/x这样的正则表达式修饰符和像s/这样的正则表达式运算符,但我可以稍后对其进行补充。

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-03 07:13:23

这些操作符可以包含任意的Perl代码,并且没有相应的规范。

例如,在

代码语言:javascript
复制
/$x{ EXPR }/

代码语言:javascript
复制
s// EXPR /e

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

然而,我不认为你真的需要知道如何解析它。你只需要知道它在哪里结束。这很简单。Perl还需要能够在解析操作符之前做到这一点,因此它不允许某些代码模式。(因此,上面的“几乎”。)

当分隔符为()[]{}时,分隔符的前面必须有奇数个分隔符。当分隔符为()[]{}时,只要分隔符是对称的,分隔符就可能显示为未转义。

代码语言:javascript
复制
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+/

备注:

  • 规则可能无法正确地将«'»作为分隔符处理。
  • 需要添加一个规则以允许«\»作为分隔符,但我认为您不应支持此操作。
票数 5
EN

Stack Overflow用户

发布于 2011-08-03 06:56:22

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

另请参阅perlreref

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6918678

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档