【问题标题】:regex fails with dollar sign正则表达式因美元符号而失败
【发布时间】:2019-05-11 21:07:02
【问题描述】:

在 R 中,我试图匹配来自文件名向量的一系列字符串。我只想要那些没有以 .tif 结尾的字母

allfiles <- c("181129_16_00_class_mlc.tif", "181129_16_00.tif.aux.xml", "181129_17_00_01_19.tif", "181129_17_00_01_20.tif", "181129_17_00_01_23.tif", "181129_17_00_01_24.tif", "181129_17_00_01_25.tif", "181129_17_00_01_26.tif", "181129_17_00_01_27.tif", "181129_17_00_01_28.tif", "181129_17_00_01_29.tif", "181129_17_00_01_30.tif")

 grepl("^[0-9_]+[.tif]", allfiles)
 grepl("^[0-9_]+[.tif]$", allfiles)

返回:

[1] FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

为什么美元符号会失败?我对第二个 grepl 的预期结果是:

[1] FALSE FALSE TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE

【问题讨论】:

  • 对不起,错字,给你。
  • 应该是[.tif]+$?或者只是\.tif$?
  • "^[0-9_]+\\.tif$" 有效(需要双重反冲),但我仍然不明白为什么 [.tif]$ 失败。
  • [.tif] 表示“.、t、i 或 f 中的任何一个字符。”这不是你想要表达的。

标签: r regex grepl


【解决方案1】:

失败的不是$,而是括号的使用。相反,你想要

grepl("^[0-9_]+\\.tif$", allfiles)
# [1] FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE

同时,^[0-9_]+[.tif]$ 表示在所有数字和/或 _ 之后,最后只有 t、i、f 或 .也就是说,只有其中之一。例如,

grepl("^[0-9_]+[.tif]$", "1234t")
# [1] TRUE
grepl("^[0-9_]+[.tif]$", "1234tt")
# [1] FALSE

【讨论】:

    猜你喜欢
    • 2011-07-18
    • 2011-03-11
    • 1970-01-01
    • 1970-01-01
    • 2022-12-04
    • 1970-01-01
    • 2020-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多