【问题标题】:Regex to match only semicolons not in parenthesis [duplicate]正则表达式仅匹配不在括号中的分号[重复]
【发布时间】:2021-11-16 09:24:08
【问题描述】:

我有以下字符串:

Almonds ; Roasted Peanuts  (Peanuts; Canola Oil  (Antioxidants (319; 320)); Salt); Cashews 

我想将不在括号中的分号替换为逗号。括号内可以有任意数量的括号和任意数量的分号,结果应如下所示:

Almonds , Roasted Peanuts  (Peanuts; Canola Oil  (Antioxidants (319; 320)); Salt), Cashews 

这是我当前的代码:

x<- Almonds ; Roasted Peanuts  (Peanuts; Canola Oil  (Antioxidants (319; 320)); Salt); Cashews 

gsub(";(?![^(]*\\))",",",x,perl=TRUE)

[1] "Almonds , Roasted Peanuts  (Peanuts, Canola Oil  (Antioxidants (319; 320)); Salt), Cashews "

我面临的问题是如果在更大的括号内有一个嵌套的 (),我拥有的正则表达式会将分号替换为逗号。

我能否获得一些关于正则表达式的帮助以解决问题?提前谢谢你。

【问题讨论】:

  • 但是,AlmondsRoasted 之间的逗号在括号之间。
  • 这很好,因为我的最终目标是用逗号分割字符串。如果它使事情变得更容易,我也可以排除大括号,即Almonds ; Roasted Peanuts (Peanuts; Canola Oil (Antioxidants (319; 320)); Salt); Cashews 希望这是有道理的:)
  • 另一个例子:Peanuts (32.5%); Macadamia Nuts (14%; PPPG(AHA)); Hazelnuts (9%); nuts(98%) 理想结果:Peanuts (32.5%), Macadamia Nuts (14%; PPPG(AHA)), Hazelnuts (9%), nuts(98%)
  • 我已经有了一个答案,如何用不在嵌套括号内的逗号分隔,请参阅this thread。这里不需要gsub,直接使用strsplit
  • @Thefourthbird "my final goal is to split the string by comma" - 这是关于分裂的。请重新关闭。

标签: r regex regex-lookarounds pcre


【解决方案1】:

;(?![^(]*\)) 模式表示匹配一个分号,并断言右边的不是),中间没有(

对于嵌套的左括号,该断言将成立,并且仍将匹配 ;


您可以使用递归模式来匹配嵌套括号以匹配您不想更改的内容,然后使用 SKIP FAIL 方法。

然后你可以匹配分号并用逗号替换它们。

[^;]*(\((?>[^()]+|(?1))*\))(*SKIP)(*F)|;

部分模式匹配

  • [^;]* 匹配 0+ 次除 ; 之外的任何字符
  • ( 捕获第 1 组
    • \(匹配开口(
    • (?&gt;原子团
      • [^()]+ 匹配除 () 之外的任何字符 1+ 次
      • |或者
      • (?1)递归整个第一个子模式(组1)
    • )*关闭原子组并可选择重复
    • \) 匹配结束)
  • )关闭第一组
  • (*SKIP)(*F) 跳过匹配项
  • |或者
  • ; 匹配分号

查看regex demoR demo

x <- c("Almonds ; Roasted Peanuts  (Peanuts; Canola Oil  (Antioxidants (319; 320)); Salt); Cashews",
"Peanuts (32.5%); Macadamia Nuts (14%; PPPG(AHA)); Hazelnuts (9%); nuts(98%)")

gsub("[^;]*(\\((?>[^()]+|(?1))*\\))(*SKIP)(*F)|;",",",x,perl=TRUE)

输出

[1] "Almonds , Roasted Peanuts  (Peanuts; Canola Oil  (Antioxidants (319; 320)); Salt), Cashews"
[2] "Peanuts (32.5%), Macadamia Nuts (14%; PPPG(AHA)), Hazelnuts (9%), nuts(98%)"               

【讨论】:

  • 仅供参考:(?&gt;[^()]++|(?1))* 不必同时包含原子组和所有格量词(它们具有相同的目的来阻止回溯),(?:[^()]++|(?1))*(?&gt;[^()]+|(?1))* 就足够了。跨度>
猜你喜欢
  • 2015-06-23
  • 2021-07-01
  • 2023-04-02
  • 2019-04-18
  • 1970-01-01
  • 1970-01-01
  • 2011-07-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多