Regex 与R正则表达式中的Perl/x(忽略空白)模式等效

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

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][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)
赞扬PCRE

获得PCRE是一件好事

PCRE与.NET、Matthew Barnett的Python
regex
模块以及Perl本身一起,是最佳Perl风格引擎的竞争者之一。它广泛应用于高可视性环境(Apache、PHP、Notepad++),因此受到了广泛关注。除其他款待外,它还为您提供了独特的功能,如:

  • 递归和子例程调用
  • \K
    以“排除”到目前为止已匹配的内容与返回的匹配
  • 回溯控制:
    (*SKIP)(*F)
    和其他
  • 分支重置(允许您在不同位置设置捕获组#1)
  • (?(DEFINE).
    ,它可以帮助您重构复杂的正则表达式
  • 条件句
PCRE中缺少什么

  • 无限宽度lookbehinds(如.NET)将是一个非常好的补充
  • 因此.NET的平衡组将非常有趣。
    这可能永远不会发生,因为平衡组通常被视为递归的可怜兄弟……然而,它允许您做其他事情,例如轻松设置计数器
  • 字符类减法
  • 有些人可能会错过Barnett的
    regex
    模块中的模糊匹配(因为我没有使用该功能,所以无法进行评论)

供参考,编辑:对于第二个问题,在R手册中添加了ref。谢谢。这会让它过滤一段时间,但这似乎已经完全解决了问题。我链接到的PCRE手册部分提到了
(?x)
因此得到了答案,但我似乎跳过了它,没有意识到它是一个可以与regex一起传递的开关。@AriB.Friedman一些值得注意的改进:1.可以在regex中的任何点打开
(?x)
,2.可以使用
(?-x)关闭它
,3.您只需使用
(?x:\w\d)打开一组括号即可
。此外,PCRE是目前最好的正则表达式库之一,与.NET、Perl和Matthew Barnett的Python
regex
模块一起,它是排名第一的竞争者。我只想指出,
Perl!=PCRE
@HamZa谢谢,是的,你还没有看到底部的
赞扬PCRE
部分:)@哈姆扎搞乱了那个部分,请让我知道如果你看到什么要补充的,想不出比你更好的编辑。。。干杯!:)