使用R在大括号之间提取特定字符

时间:2018-04-21 13:07:28

标签: r regex

基于以下字符串

{EP03-C18} - {EP03-C19}

我可以使用\{(.*?)\}选择大括号中的值 但我怎样才能只选择-

以获取类似{EP03C18} - {EP03C19}

的字符串

4 个答案:

答案 0 :(得分:3)

如果您的字符串具有均衡的未使用{...},您可以使用

s = "{EP03-C18} - {EP03-C19}"
gsub("-(?=[^{}]*})", "", s, perl=TRUE)
## => [1] "{EP03C18} - {EP03C19}"

-(?=[^{}]*})模式与-匹配,后跟0 {+ 1}}和{以外的0 +字符,然后是}。由于}是预测,因此匹配的文字不会添加到匹配值中,您可以使用正则表达式删除(?=...)内的任意数量的-

如果您的字符串较多且包含大量未配对的{...}{,则使用}会更安全:

gsubfn

<强>详情

  • library(gsubfn) gsubfn("{[^{}]+}", ~ gsub("-","",x,fixed=TRUE), s) ## => [1] "{EP03C18} - {EP03C19}" - 匹配{
  • { - 除[^{}]+{以外的一个或多个字符
  • } - }
  • } - 删除匹配中的所有gsub("-","",x,fixed=TRUE)

答案 1 :(得分:2)

你可以使用lookaheads在大括号内查找破折号:

gsub("-(?=[^{}]*})", "", "{EP03-C18} - {EP03-C19}", perl=TRUE)

输出:

[1] "{EP03C18} - {EP03C19}"

然而,这假设所有牙箍均衡。

<强> Live demo

故障:

  • -匹配短划线
  • (?=开始积极前瞻
    • [^{}]*}如果它遇到一个右大括号(没有跳过大括号)
  • )前瞻结束

答案 2 :(得分:0)

您可以使用此(.*?{[^-]+)-([^-]+}.*?)

匹配除{}

之间的连字符以外的所有内容

regex demo

<强>输出

{EP03C18} - {EP03C19}

答案 3 :(得分:0)

您可以使用以下正则表达式进行搜索,并使用空字符串替换。

(?<=\{\w+)-

它使用正向lookbehind来确保 - 字符位于一个开口大括号之后。

如果您使用的正则表达式包不支持lookbehinds,您可以使用以下正则表达式进行搜索并替换为捕获组1。

(\{\w+)-