Perl有一个可爱的修饰符/x
,它忽略正则表达式中的空白。也就是说,它不是不考虑空格而匹配,而是在解释正则表达式时省略空格,除非进行了转义。
。在/x
模式下,^x[0-7][x-z][ABCpuq*]*$
可以和^x [0-7] [x-z] [ABCpuq*]*$
一样写入,但可读性更强。
grep
及其在R中的同类似乎没有这样的模式,但考虑到它们的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中,要对整个表达式使用自由空格模式,请在PCRE模式(perl=TRUE
)下的regex开头弹出(?x)
模式修饰符。
的例子:
grepl("(?x) # free spacingrn\d # a digitrn[bc] # b or c", subject, perl=TRUE);
(?x)修饰符适用于大多数正则表达式。一些例外:JavaScript, MySQL, Oracle, VBScript, XPath。
Perl模式和PCRE
Perl模式有多依赖于PCRE?完全。(这是一件好事。见下文。)
来自R手册:
perl = TRUE参数给grep, regexpr, gregexpr, sub, gsub和strsplit切换到实现regular的PCRE库使用相同语法和语义的表达式模式匹配Perl 5.10,只有几个不同之处。
一些细化
- 你可以在正则表达式的任何点打开
(?x)
- 可以通过
(?-x)
关闭 - 你可以只打开一组括号,如
(?x: w d)
访问PCRE是一件好事。
PCRE是最佳Perl风格引擎的竞争者之一,与。net、Matthew Barnett的Python regex
模块和Perl本身一样。它广泛应用于高可见性环境(Apache、PHP、notepad++),因此得到了很多关注。除此之外,它还为您提供了访问奇异特性的权限,例如:
- 递归和子程序调用
-
K
"保留"到目前为止与返回匹配匹配的内容 - 回溯控制:
(*SKIP)(*F)
和其他 - 分支复位(允许您在不同的地方设置捕获组#1)
-
(?(DEFINE)...
,它可以帮助你重构一个复杂的正则表达式 - 条件。
PCRE中缺少什么?
- 无限宽度后视(如在。net中)将是一个了不起的补充。 所以。net真的很有趣
- 字符类减法。
- 有些人可能会错过Barnett的
regex
模块的模糊匹配(不能评论,因为我没有使用过该功能)。
balancing groups
。这可能永远不会发生,因为平衡组通常被视为递归的可怜兄弟……但是,它允许您做其他事情,例如轻松设置计数器。