gpt4 book ai didi

regex - R 正则表达式中 Perl/x(忽略空格)模式的等价物

转载 作者:行者123 更新时间:2023-12-04 18:41:52 24 4
gpt4 key购买 nike

Perl 有一个可爱的修饰符 /x忽略正则表达式中的空格。也就是说,不是不管空格如何都匹配,而是它在正则表达式的解释中省略空格,除非转义。

IE。 ^x[0-7][x-z][ABCpuq*]*$可以等效地写成 ^x [0-7] [x-z] [ABCpuq*]*$,但更易读。在 /x模式。
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 setting bit打开忽略空格。

最佳答案

自由间距模式

在 R 中,要对整个表达式使用自由间距模式,弹出 (?x)在 PCRE 模式 ( perl=TRUE ) 中,正则表达式开头的模式修饰符。

例子:

grepl("(?x)  # free spacing\r\n\\d    # a digit\r\n[bc]  # b or c", subject, perl=TRUE);

(?x) 修饰符适用于大多数正则表达式。一些异常(exception):JavaScript、MySQL、Oracle、VBScript、XPath。

Perl 模式和 PCRE

Perl 模式对 PCRE 的依赖程度如何?完全。 (这是一件好事。见下文。)

来自 R manual :

The perl = TRUE argument to grep, regexpr, gregexpr, sub, gsub and strsplit switches to the PCRE library that implements regular expression pattern matching using the same syntax and semantics as Perl 5.10, with just a few differences.



一些改进
  • 你可以打开(?x)在正则表达式中的任何位置
  • 您可以使用 (?-x) 将其关闭
  • 您可以只为一组括号打开它,如 (?x: \w \d)

  • 赞美PCRE

    可以访问 PCRE 是一件好事。

    PCRE 与 .NET、Matthew Barnett 的 regex 是最佳 Perl 风格引擎的竞争者之一。 Python 的模块和 Perl 本身。它广泛用于高可见性环境(Apache、PHP、Notepad++),因此受到了很多关注。除其他款待外,它还使您可以访问异国情调的功能,例如:
  • 递归和子程序调用
  • \K将到目前为止与返回的匹配
  • 匹配的内容“拒之门外”
  • 回溯控制:(*SKIP)(*F)和其他
  • 分支重置(允许您在不同位置设置捕获组#1)
  • (?(DEFINE)... ,它可以帮助您重构复杂的正则表达式
  • 条件。

  • PCRE 中缺少什么?
  • 无限宽度的lookbehinds(如.NET)将是一个了不起的补充。
  • .NET 真的很有趣balancing groups .这可能永远不会发生,因为平衡组通常被视为递归的可怜兄弟......但是,它允许您做其他事情,例如轻松设置计数器。
  • 字符类减法。
  • 有些人可能会错过 Barnett 的 regex 中的模糊匹配。模块(无法评论,因为我没有使用该功能)。
  • 关于regex - R 正则表达式中 Perl/x(忽略空格)模式的等价物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24224032/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com