用于括号内文本的Ruby正则表达式

时间:2011-05-23 18:50:00

标签: ruby regex

我正在寻找一个正则表达式来替换括号中的所有术语,除非括号在方括号内。

e.g。

(matches) #match
[(do not match)] #should not match
[[does (not match)]] #should not match

我目前有:

[^\]]\([^()]*\) #Not a square bracket, an opening bracket, any non-bracket character and a closing bracket.

然而,这仍然是方括号内的匹配词。

到目前为止,我还创建了一个我的进度的rubular页面:http://rubular.com/r/gG22pFk2Ld

2 个答案:

答案 0 :(得分:2)

这是使用纯正则表达式方法的cannot parse表达式,因为您需要跟踪当前嵌套/ state_if_in_square_bracket(因此您没有类型3语言了)。

但是,根据具体情况,您可以使用多个正则表达式或简单解析器对其进行解析。示例方法:

  • 拆分为子字符串,由。分隔 [ / [[] / ]],更改状态 当这样的方括号时 遇到了,在一个替换() 子字符串if in “not_in_square_bracket”州
  • 解析方括号(包括内容),删除&记住它们(这些是“注释”),现在替换普通括号中的所有内容并重新添加方括号内容(您可以通过使用唯一的临时字符串记住内容)

解决方案的复杂性还取决于允许转义的详细信息。

答案 1 :(得分:2)

如果可以嵌套方括号(see this related question),正则表达式不会为你剪切。

我认为你只能使用正则表达式,如果(a)你只允许一个方括号和(b)你假设所有方括号都正确匹配。在那种情况下

\([^()]*\)(?![^\[]*])

就足够了 - 它匹配任何带括号的表达式而不是,后跟未配对的]。你需要(b)因为负面观察的限制(只有固定长度的字符串在1.9中,而在1.8中根本不允许),这意味着即使你不想这样,你也会被卡住(match)]。 / p>

所以基本上如果你需要嵌套,或者允许不匹配的括号,你应该抛弃正则表达式并查看answer到我上面链接的问题。