我有一个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?
答案 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)