首页 > 解决方案 > 替换第一个括号和之间的文本。无需卸下支架和

问题描述

我想用特定的字符串替换括号之间的 70,比如说“80”。

从过滤器[70.00-100.00] --> 过滤器[80.00-100.00]

但是,当使用以下代码时:

str_replace('filter [70.00-140.00]'," *\\[.*?\\. *",'80')

输出是:

filter8000-140.00]

有什么办法可以替换 \ 和 . (在本例中为 70)而不删除 \ 和 . ?

标签: rregexbrackets

解决方案


[使用后替换任何一位或多位数字

library(stringr)
str_replace('filter [70.00-140.00]','(?<=\\[)\\d+', '80')
sub('\\[\\d+', '[80', 'filter [70.00-140.00]')
sub('(?<=\\[)\\d+', '80', 'filter [70.00-140.00]', perl=TRUE)

请参阅在线 R 演示(?<=\[)\d+匹配紧接在前面的位置,[然后是一个或多个数字。\[\d+匹配[和一个或多个数字,因此[必须恢复并因此添加到替换模式中。

要准确替换70,您可以使用

library(stringr)
str_replace('filter [70.00-140.00]',"(\\[[^\\]\\[]*)70",'\\180')
# => [1] "filter [80.00-140.00]"

sub('(\\[[^][]*)70','\\180', 'filter [70.00-140.00]')
# => [1] "filter [80.00-140.00]"

请参阅正则表达式演示详情

  • (\[[^\]\[]*)- 第 1 组: ,然后是除and[之外的零个或多个字符[]
  • 70- 一个70字符串。

在替换中,\1插入 Group 1 值。

另一种解决方案可能是将方括号内所有出现的字符串70替换为.70

str_replace_all(
  'filter [70.00-140.00]',
  '\\[[^\\]\\[]*]',
  function(x) gsub('(?<!\\d|\\d\\.)70\\b', '80', x, perl=TRUE))
# => [1] "filter [80.00-140.00]"

在这里,\[[^\]\[]*]匹配两个方括号之间的字符串,中间没有其他方括号,并且gsub('(?<!\\d|\\d\\.)70\\b', '80', x, perl=TRUE)仅在这些匹配的子字符串上运行。(?<!\d|\d\.)70\b匹配任何前面70没有 digit 或 digit +.并且后面没有另一个单词 char(字母、数字或_或连接符标点符号,因为 ICU 正则表达式默认情况下可识别 Unicode)。


推荐阅读