仅替换括号内的某些字符(R)

时间:2015-03-08 13:56:54

标签: regex r string

我发现编写一个转换字符串类型的正则表达式有点困难:

[1] "[hola;adios] address1;[hola;adios] address2"

成:

[1] "[hola|adios] address1;[hola|adios] address2"

即将括号内的分号替换为竖线。我做的尝试要么无法仅替换括号内的分号(外部的分号也被替换),要么替换整个子串[hola; adios]为竖线。

如果有人能给我一些关于如何使用R语言完成这项任务的指示,我将非常感激

2 个答案:

答案 0 :(得分:3)

您可以尝试以下gsub命令。

> x <- '[hola;adios] address1;[hola;adios] address2'
> gsub(";(?=[^\\[\\]]*\\])", "|", x, perl=T)
[1] "[hola|adios] address1;[hola|adios] address2"

;(?=[^\\[\\]]*\\])仅匹配所有分号,

  • [^\[\]]*任何字符,但不是[],零次或多次。
  • \]还有一个方括号。所以这将匹配[]方括号内的所有分号。 (?=...)称为积极前瞻断言。

DEMO

> gsub(";(?![^\\[\\]]*\\[)", "|", x, perl=T)
[1] "[hola|adios] address1;[hola|adios] address2"

(?!...)称为负向前瞻,与正向前瞻断言相反。

答案 1 :(得分:1)

使用gsubfn包,可以避免使用外观。

x <- '[hola;adios] address1;[hola;adios] address2'
gsubfn('\\[[^]]*]', ~ gsub(';', '|', x), x)
# [1] "[hola|adios] address1;[hola|adios] address2"