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

Ari*_*man 5 regex pcre r

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

^x[0-7][x-z][ABCpuq*]*$可以等效地编写,但^x [0-7] [x-z] [ABCpuq*]*$/x模式中可读得更多.

grepR中的它似乎没有这样的模式,但考虑到它们的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
Run Code Online (Sandbox Code Playgroud)

次要问题:R的Perl风格的正则表达式如何直接依赖于C PCRE库?似乎有一个PCRE_Extended设置位打开忽略空格.

zx8*_*x81 6

自由间隔模式

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

例:

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

(?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的regexPython模块和Perl本身一样.它广泛用于高可见性环境(Apache,PHP,Notepad ++),因此受到了很多关注.在其他款待中,它可以让您访问异国情调的功能,例如:

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

PCRE缺少什么?

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

  • @AriB.Friedman一些值得注意的改进:1.你可以在正则表达式中的任何一点打开`(?x)`2.你可以用`(? - x)`来关闭它.3.你可以打开它只有一组带有`(?x:\ w\d)`的括号.此外,PCRE是最好的正则表达式库之一,是争夺榜首的竞争者,还有.NET,Perl和Matthew Barnett的用于Python的`regex`模块. (2认同)