大多数stringr
函数只是相应stringi
函数的包装器。 str_replace_all
就是其中之一。但我的代码不适用于stri_replace_all
,相应的stringi
函数。
我正在编写一个快速正则表达式,用于转换(一部分)驼峰案例到间隔词。
我很疑惑为什么会这样:
str <- "thisIsCamelCase aintIt"
stringr::str_replace_all(str,
pattern="(?<=[a-z])([A-Z])",
replacement=" \\1")
# "this Is Camel Case ain't It"
这不是:
stri_replace_all(str,
regex="(?<=[a-z])([A-Z])",
replacement=" \\1")
# "this 1s 1amel 1ase ain't 1t"
答案 0 :(得分:7)
如果查看stringr::str_replace_all
的来源,您会看到它调用fix_replacement(replacement)
将\\#
捕获组引用转换为$#
。但stringi:: stri_replace_all
上的帮助也清楚地表明您对捕获组使用$1
,$2
等。
str <- "thisIsCamelCase aintIt"
stri_replace_all(str, regex="(?<=[a-z])([A-Z])", replacement=" $1")
## [1] "this Is Camel Case aint It"
答案 1 :(得分:0)
以下选项应在两种情况下都返回相同的输出。
pat <- "(?<=[a-z])(?=[A-Z])"
str_replace_all(str, pat, " ")
#[1] "this Is Camel Case aint It"
stri_replace_all(str, regex=pat, " ")
#[1] "this Is Camel Case aint It"
根据?stri_replace_all
的帮助页面,有一些示例建议$1
,$2
用于替换
stri_replace_all_regex('123|456|789', '(\\p{N}).(\\p{N})', '$2-$1')
因此,如果我们将\\1
替换为$1
stri_replace_all(str, regex = "(?<=[a-z])([A-Z])", " $1")
#[1] "this Is Camel Case aint It"