R正则表达式中的Perl / x(忽略空格)模式的等价物

时间:2014-06-14 20:30:47

标签: regex r pcre

Perl有一个可爱的修饰符/x,忽略了正则表达式中的空格。也就是说,不管空格如何都匹配,而是在正则表达式的解释中省略空格,除非转义。

即。 ^x[0-7][x-z][ABCpuq*]*$可以在^x [0-7] [x-z] [ABCpuq*]*$模式下以/x等效地编写,但更为可读。

R中的{p> grep似乎没有这样的模式,但考虑到它们的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 setting bit开启忽略空格。

1 个答案:

答案 0 :(得分:6)

自由间距模式

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

示例:

grepl("(?x)  # free spacing\r\n\\d    # a digit\r\n[bc]  # b or c", subject, perl=TRUE);

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

Perl模式和PCRE

Perl模式与PCRE的接近程度如何?完全。 (这是件好事。见下文。)

来自R manual

  

grep,regexpr,gregexpr,sub,gsub的perl = TRUE参数   strsplit切换到实现常规的PCRE库   表达式模式匹配使用相同的语法和语义   Perl 5.10,只有一些差异。

一些优化

  • 您可以在正则表达式
  • 中的任何位置启用(?x)
  • 您可以使用(?-x)
  • 将其关闭
  • 您可以只为一组括号打开它,就像在(?x: \w \d)
  • 中一样

赞美PCRE

访问PCRE是一件好事。

PCRE是最佳Perl风格引擎头衔的竞争者之一 - 与.NET,Matthew Barnett的Python regex模块以及Perl本身一样。它广泛用于高可见性环境(Apache,PHP,Notepad ++),因此受到了很多关注。在其他款待中,它可以让您访问异国情调的功能,例如:

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

PCRE缺少什么?

  • 无限宽度的lookbehinds(如在.NET中)将是一个非常好的补充。
  • .NET会非常有趣balancing groups。这可能永远不会发生,因为平衡组通常被视为递归的可怜兄弟......但是,它允许你做其他事情,比如轻松设置计数器。
  • 字符类减法。
  • 有些人可能会错过Barnett的regex模块中的模糊匹配(由于我没有使用该功能,因此无法发表评论)。