将字符串/正则表达式转换为保存文件名的功能

时间:2014-12-11 13:40:49

标签: regex r

我有一个regexp列表,用于生成一些图形。我想用文件名中的相应正则表达式保存图形。例如:

re <- 'foo\\w{3}bar'
# ... produce a graph here and now need a filename
not_save <- paste0("pefix ", re, ".suffix")

但是re需要从文件名中不允许的每一个中清除。我知道,它与操作系统和文件系统有关,但我认为如果它是Windows上的有效文件名,它在任何地方都有效。

我可以用gsub()替换错误的字符:

not_save_enough <- gsub('[$^*|{}()/:]', '_', re, perl=TRUE)

但我不知道所有错误的字符,也不知道如何替换\和/或[]。用_替换所有字符就足够了。不幸的是像

 gsub('\Q\\E', '_', "Numbers are \d", perl=TRUE)

即使使用perl = TRUE也无法生效

  

错误:'\ Q'是一个无法识别的转义字符串,以“'/ \ Q”开头

是否有像make_string_save_to_use_it_as_filename()这样的函数?

如何在字符串中替换\[]以及其他regexp-meta-chars?

2 个答案:

答案 0 :(得分:1)

我想你想要这样的东西,

> re <- 'foo\\w{3}bar'
> not_save_enough <- gsub('[$^*|{}\\[\\]()/:\\\\]', '_', re, perl=TRUE)
> not_save_enough
[1] "foo_w_3_bar"
> re <- 'foo\\w{3}bar[foo]foo(buz)kj^jkj$jhh*foo|bar/hjh'
> not_save_enough <- gsub('[$^*|{}\\[\\]()/:\\\\]', '_', re, perl=TRUE)
> not_save_enough
[1] "foo_w_3_bar_foo_foo_buz_kj_jkj_jhh_foo_bar_hjh"

在R正则表达式中,你需要再反斜杠三次以匹配文字反斜杠。

答案 1 :(得分:1)

  

如何在字符串中替换\ [ ]和其他元字符?

如果这里的想法是替换坏字符,您可以考虑POSIX类[[:punct:]]。 ASCII范围内的此POSIX命名类与所有非控件,非字母数字,非空格字符匹配。

!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~

因此,如果您想要使用下划线替换每个实例,您可以这样做......

fn <- gsub('[[:punct:]]', '_', 'foo\\w{3}bar')
# [1] "foo_w_3_bar"

使用\Q\E可以确保两者之间的任何字符都是字面匹配,而不是正则表达式引擎解释为元字符。同样在 R 中,分隔符/.../g全局)模式修饰符语法无效。以下是演示正确用法的示例:

x <- '[[[(((123]'
gsub('\\Q[[[(((\\E', '[', x, perl=T)
# [1] "[123]"

如果您需要使用修饰符,请确保已启用perl=TRUE并使用内联修饰符,即(?ismx)