R 在具有给定条件的字符串中添加括号

R 在具有给定条件的字符串中添加括号,r,regex,stringr,R,Regex,Stringr,我想在条件下为下面的字符串添加括号。这些数字由两部分组成:“Id-subId”,我想在有多个subId时加上括号 sample_string1 = "376-12~23, 28, 32, 35, 37,376-1" sample_string2 = "391-1~8, 391-22~23" sample_string3 = "391-10~21, 391-24, 27, 29" 这是我想要的结果 desire_string1 = &

我想在条件下为下面的字符串添加括号。这些数字由两部分组成:“Id-subId”,我想在有多个subId时加上括号

sample_string1 = "376-12~23, 28, 32, 35, 37,376-1"
sample_string2 = "391-1~8, 391-22~23"
sample_string3 = "391-10~21,  391-24, 27, 29"
这是我想要的结果

desire_string1 = "376-(12~23, 28, 32, 35, 37),376-1"
desire_string2 = "391-(1~8), 391-(22~23)"
desire_string3 = "391-(10~21),  391-(24, 27, 29)"

我该怎么做?提前感谢

这是一个相当复杂的正则表达式问题。我真诚地建议您不要使用此解决方案,而是将所需的变量分离出来,并使其整洁

然而,你问了这个问题,这里有一个正则表达式的答案。我使用了
stringr
包,因为我发现它比
grep
更容易阅读

正则表达式分解如下:


(?产生正确输出的正则表达式是:

(?:(\d+-)((?:\d+~\d+|(?:,?\s*\d+){2,})+)(?=,\s*\d+-|\"))
演示:

  • (\d+-)
    匹配ID和破折号
  • \d+~\d+
    匹配子ID范围或
  • (?:,?\s*\d+{2,}
    至少两个子ID
  • (?=,\s*\d+-\124;\”
    对下一个ID或结束引号进行正向展望
(?:(\d+-)((?:\d+~\d+|(?:,?\s*\d+){2,})+)(?=,\s*\d+-|\"))