Regex 与R正则表达式中的Perl/x(忽略空白)模式等效
Perl有一个可爱的修饰符Regex 与R正则表达式中的Perl/x(忽略空白)模式等效,regex,r,pcre,Regex,R,Pcre,Perl有一个可爱的修饰符/x,它忽略正则表达式中的空格。也就是说,它不匹配任何空格,而是在解释正则表达式时省略空格,除非转义 也就是说,^x[0-7][x-z][ABCpuq*]*$可以与^x[0-7][x-z][ABCpuq*]*$模式中的^x[0-7][x-z][ABCpuq*.*$等效编写,但可读性更高 grep和它在R中的同类似乎没有这样的模式,但是考虑到它们的Perl兼容性,有没有一个选项可以通过呢?我尝试过一些选择,但没有这样的运气 > grepl( "^x[0-7][x-z
/x
,它忽略正则表达式中的空格。也就是说,它不匹配任何空格,而是在解释正则表达式时省略空格,除非转义
也就是说,^x[0-7][x-z][ABCpuq*]*$
可以与^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库?似乎存在一个打开忽略空白的模式。自由间距模式 在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的依赖程度如何?完全(这是件好事,见下文。)
发件人:
grep、regexpr、gregexpr、sub、gsub和
strsplit切换到实现常规
使用与相同语法和语义的表达式模式匹配
Perl 5.10,只是有一些区别
一些改进
- 您可以在正则表达式中的任意点启用
(?x)
- 您可以使用
(?-x)
- 您可以只为一组括号启用它,如
(?x:\w\d)
regex
模块以及Perl本身一起,是最佳Perl风格引擎的竞争者之一。它广泛应用于高可视性环境(Apache、PHP、Notepad++),因此受到了广泛关注。除其他款待外,它还为您提供了独特的功能,如:
- 递归和子例程调用
以“排除”到目前为止已匹配的内容与返回的匹配\K
- 回溯控制:
和其他(*SKIP)(*F)
- 分支重置(允许您在不同位置设置捕获组#1)
,它可以帮助您重构复杂的正则表达式(?(DEFINE).
- 条件句
- 无限宽度lookbehinds(如.NET)将是一个非常好的补充
- 因此.NET的平衡组将非常有趣。
这可能永远不会发生,因为平衡组通常被视为递归的可怜兄弟……然而,它允许您做其他事情,例如轻松设置计数器
- 字符类减法
- 有些人可能会错过Barnett的
模块中的模糊匹配(因为我没有使用该功能,所以无法进行评论)regex
(?x)
因此得到了答案,但我似乎跳过了它,没有意识到它是一个可以与regex一起传递的开关。@AriB.Friedman一些值得注意的改进:1.可以在regex中的任何点打开(?x)
,2.可以使用(?-x)关闭它
,3.您只需使用(?x:\w\d)打开一组括号即可
。此外,PCRE是目前最好的正则表达式库之一,与.NET、Perl和Matthew Barnett的Pythonregex
模块一起,它是排名第一的竞争者。我只想指出,Perl!=PCRE
@HamZa谢谢,是的,你还没有看到底部的赞扬PCRE
部分:)@哈姆扎搞乱了那个部分,请让我知道如果你看到什么要补充的,想不出比你更好的编辑。。。干杯!:)