Perl有一个可爱的修饰符/x
,忽略了正则表达式中的空格。也就是说,不管空格如何都匹配,而是在正则表达式的解释中省略空格,除非转义。
即。 ^x[0-7][x-z][ABCpuq*]*$
可以在^x [0-7] [x-z] [ABCpuq*]*$
模式下以/x
等效地编写,但更为可读。
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开启忽略空格。
答案 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)
和其他人(?(DEFINE)...
,可以帮助您重构复杂的正则表达式PCRE缺少什么?
balancing groups
。这可能永远不会发生,因为平衡组通常被视为递归的可怜兄弟......但是,它允许你做其他事情,比如轻松设置计数器。regex
模块中的模糊匹配(由于我没有使用该功能,因此无法发表评论)。