【问题标题】:The match that begins earliest wins?最早开始的比赛获胜?
【发布时间】:2012-03-15 02:58:38
【问题描述】:

有人告诉我,正则表达式遵守这条规则:最早开始的比赛获胜。

> aab <- "aab"
> gsub("a.*?b", "", aab, perl=T)
[1] ""
> gsub("a.*b", "", aab, perl=T)
[1] ""

目前看来,规则是遵守的,但是……

> aab <- "\na\nab"
> gsub("\n.*?b", "", aab, perl=T)
[1] "\na"
> gsub("\n.*b", "",aab, perl=T)
[1] "\na"

为什么它现在不服从?

【问题讨论】:

    标签: regex r


    【解决方案1】:

    这是因为.默认表示“换行符以外的任何字符”;所以完整的字符串\na\nab实际上不能匹配\n.*b(因为中间的\n.不匹配)。唯一匹配它的部分是子字符串\nab

    要将. 更改为“任何字符,甚至换行符”,您可以在模式的前面插入魔术序列(?s)

    gsub("(?s)\n.*?b", "", aab, perl=T)
    

    打开s 选项(表示“单行”模式,虽然名称具有误导性:它的唯一作用是通过这种方式改变. 的含义)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-13
      • 2021-08-04
      • 2012-05-20
      • 1970-01-01
      • 1970-01-01
      • 2015-11-02
      • 2013-03-08
      • 1970-01-01
      相关资源
      最近更新 更多