regex 移除其他两个字符之间的所有字符(保留其他字符)

jjhzyzn0  于 2022-11-26  发布在  其他
关注(0)|答案(3)|浏览(156)

我知道这个问题已经以不同的方式被问了很多次,但是我找不到一个解决方案,我会在保留边框的同时替换一些“边框”之间的文本。

input <- "this is my 'example'"
change <- "test"

现在我想用change中的值替换单引号之间的所有内容。
预期输出为"this is my 'test'
我尝试了不同的变体:

stringr::str_replace(input, "['].*", change)

但它不起作用。例如,上面的一个给出"this is my test",所以它不再有单引号。
有什么想法吗?

eoxn13cs

eoxn13cs1#

这边呢?

input <- "this is my 'example'"
change <- "test"

stringr::str_replace(input, "(?<=').*?(?=')", change)

**(?〈=')←看前面的字符是一个'**没有抓住它。
.←捕捉任何字符,但尽可能少。为了隐藏这样的情况“这是我的'例子'你看到'它'
**(?=')←看下面的字符是一个'**没有赶上它。

↓在这里测试↓
ideone

mkh04yzy

mkh04yzy2#

使用sub(),我们可以尝试:

input <- "this is my 'example'"
change <- "test"
output <- sub("'.*?'", paste0("'", change, "'"), input)
output

[1] "this is my 'test'"
vuktfyat

vuktfyat3#

您可以使用

stringr::str_replace_all(input, "'[^']*'", paste0("'", change, "'"))
gsub("'[^']*'", paste0("'", change, "'"), input)

或者,您也可以捕获撇号,然后使用反向引用,但这样看起来会更难看(参见gsub("(')[^']*(')", paste0("\\1",change,"\\2"), input))。
请参阅R demo online:

input <- "this is my 'example'"
change <- "test"
stringr::str_replace_all(input, "'[^']*'", paste0("'", change, "'"))
gsub("'[^']*'", paste0("'", change, "'"), input)

输出量:

[1] "this is my 'test'"
[1] "this is my 'test'"

注意:如果您的change变量包含反斜杠,则必须将其加倍以避免出现以下问题:

stringr::str_replace_all(input, "'[^']*'", paste0("'", gsub("\\", "\\\\", change, fixed=TRUE), "'"))
gsub("'[^']*'", paste0("'", gsub("\\", "\\\\", change, fixed=TRUE), "'"), input)

相关问题