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设置位打开忽略空格.
自由间隔模式
在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)和其他人(?(DEFINE)...,它可以帮助您重构复杂的正则表达式PCRE缺少什么?
balancing groups.这可能永远不会发生,因为平衡组通常被视为递归的可怜兄弟......但是,它允许你做其他事情,比如轻松设置计数器.regex模块的模糊匹配(由于我没有使用该功能,因此无法发表评论).