相当于R正则表达式中的Perl /x(忽略空格)模式



Perl有一个可爱的修饰符/x,它忽略正则表达式中的空白。也就是说,它不是不考虑空格而匹配,而是在解释正则表达式时省略空格,除非进行了转义。

。在/x模式下,^x[0-7][x-z][ABCpuq*]*$可以和^x [0-7] [x-z] [ABCpuq*]*$一样写入,但可读性更强。

grep及其在R中的同类似乎没有这样的模式,但考虑到它们的Perl兼容性,是否有一个选项可以通过?我试过几种选择,但都没那么幸运。

> grepl( "^x[0-7][x-z][ABCpuq*]*$", "x5yuuA" )
[1] TRUE
> grepl( "^x [0-7] [x-z][ABCpuq*]*$", "x5yuuA" )
[1] FALSE
> grepl( "^x [0-7] [x-z][ABCpuq*]*$", "x5yuuA", perl=TRUE )
[1] FALSE
> grepl( "^x [0-7] [x-z][ABCpuq*]*$/x", "x5yuuA", perl=TRUE )
[1] FALSE
第二个问题:R的perl风格的正则表达式如何直接依赖于C的PCRE库?似乎有一个PCRE_Extended设置位打开忽略空白

无线模式

在R中,要对整个表达式使用自由空格模式,请在PCRE模式(perl=TRUE)下的regex开头弹出(?x)模式修饰符。

的例子:

grepl("(?x)  # free spacingrn\d    # a digitrn[bc]  # b or c", subject, perl=TRUE);

(?x)修饰符适用于大多数正则表达式。一些例外:JavaScript, MySQL, Oracle, VBScript, XPath。

Perl模式和PCRE

Perl模式有多依赖于PCRE?完全。(这是一件好事。见下文。)

来自R手册:

perl = TRUE参数给grep, regexpr, gregexpr, sub, gsub和strsplit切换到实现regular的PCRE库使用相同语法和语义的表达式模式匹配Perl 5.10,只有几个不同之处。

一些细化

  • 你可以在正则表达式的任何点打开(?x)
  • 可以通过(?-x)
  • 关闭
  • 你可以只打开一组括号,如(?x: w d)

访问PCRE是一件好事。

PCRE是最佳Perl风格引擎的竞争者之一,与。net、Matthew Barnett的Python regex模块和Perl本身一样。它广泛应用于高可见性环境(Apache、PHP、notepad++),因此得到了很多关注。除此之外,它还为您提供了访问奇异特性的权限,例如:

  • 递归和子程序调用
  • K"保留"到目前为止与返回匹配匹配的内容
  • 回溯控制:(*SKIP)(*F)和其他
  • 分支复位(允许您在不同的地方设置捕获组#1)
  • (?(DEFINE)...,它可以帮助你重构一个复杂的正则表达式
  • 条件。

PCRE中缺少什么?

  • 无限宽度后视(如在。net中)将是一个了不起的补充。
  • 所以。net真的很有趣balancing groups。这可能永远不会发生,因为平衡组通常被视为递归的可怜兄弟……但是,它允许您做其他事情,例如轻松设置计数器。
  • 字符类减法。
  • 有些人可能会错过Barnett的regex模块的模糊匹配(不能评论,因为我没有使用过该功能)。

最新更新