R语言中正则表达式的空格忽略模式(类似Perl的/x模式)的等效写法

7
Perl有一个很棒的修饰符/x,可以在正则表达式中忽略空格。这并不是说它会忽略空格而匹配成功,而是在解释正则表达式时会省略空格,除非使用转义字符。
例如,^x[0-7][x-z][ABCpuq*]*$可以等效地写为^x [0-7] [x-z] [ABCpuq*]*$,在/x模式下更易读。
在R中的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设置位,可以忽略空白。


附注:关于第二个问题,已在R手册中添加了参考。 - zx81
1个回答

9

自由空格模式

在R中,要在整个表达式中使用自由空格模式,在PCRE模式(perl=TRUE)中,在正则表达式开头弹出(?x)模式修改器。

例如:

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手册

grep、regexpr、gregexpr、sub、gsub和strsplit的perl = TRUE参数将切换到实现正则表达式模式匹配的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缺少的?

  • 无限宽度的后顾断言(如.NET)将是一个极好的补充。
  • .NET真正有趣的平衡组也是如此。这可能永远不会发生,因为平衡组常常被视为递归的穷亲戚...然而,它允许你做其他事情,比如轻松设置计数器。
  • 字符类减法。
  • 一些人可能会想念Barnett的regex模块中的模糊匹配(不能评论,因为我没有使用过该特性)。

2
一些值得注意的改进:1. 你可以在正则表达式的任何位置打开 (?x),2. 你可以使用 (?-x) 关闭它,3. 你可以为一个括号集合打开它,如 (?x: \w \d)。此外,PCRE 是最好的正则表达式库之一,与 .NET、Perl 和 Matthew Barnett 的 Python regex 模块相媲美,争夺顶尖位置。 - zx81
1
我只想指出 Perl != PCRE好文推荐 - HamZa
1
@HamZa 谢谢,没错,你还没有看到底部的“赞美PCRE”部分 :) - zx81
1
@HamZa 完成了对那个部分的修改,请告诉我是否有需要添加的内容,我想不到比你更好的编辑器了... 干杯! :) - zx81
我认为R的正则表达式引擎现在是TRE。 - IRTFM
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接