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

5
我正在寻找一个正则表达式来替换括号中的所有术语,除非括号在方括号内。
例如:
(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

有点难。双方括号需要递归匹配所有对应的括号。使用 Ruby 自带的高级正则表达式库(Perl 爱好者,你好!)可能会实现。但是我感觉你可能不得不通过多组 Ruby 正则表达式来完成任务。 - Douglas F Shearer
2个回答

3
如果您可以嵌套方括号,那么正则表达式就无法解决问题(请参见此相关问题)。
我认为只有在以下情况下才能使用正则表达式:(a) 您只允许一级方括号;(b) 您假设所有方括号都正确匹配。在这种情况下,
\([^()]*\)(?![^\[]*])

足够的正则表达式是匹配任何带括号的表达式,但不包括后面跟着未配对的"]"。你需要使用(b)是因为负向回顾的限制(1.9版本只能匹配固定长度字符串,在1.8中根本不允许),这意味着即使你不想匹配(match)],你仍然会被困在其中。

所以基本上,如果你需要嵌套或允许未匹配的括号,你应该放弃正则表达式,并查看我上面链接的问题的答案


这个似乎可以工作,甚至对于嵌套的方括号也是如此,因为方括号的嵌套深度并不重要,该术语仍然匹配。 - Gazler
谢谢Andy,这对我的需求来说不是必要的。方括号始终位于开头/结尾。我在问题中应该更清楚。感谢您的解决方案。 :) - Gazler

2
这是一种表达方式,你 无法 使用纯正则表达式方法进行解析,因为你需要跟踪当前嵌套/状态_if_in_square_bracket(所以你不再有类型3的语言)。
然而,根据具体情况,您可以使用多个正则表达式或简单解析器来解析它。示例方法:
  • 将其拆分为子字符串,由 [/[[]/]] 分隔,遇到此类方括号时更改状态,在“not_in_square_bracket”状态下替换子字符串中的 ()。
  • 解析方括号(包括内容),删除并记住它们(这些是“注释”),现在替换普通括号中的所有内容并重新添加方括号内容(您可以使用唯一的临时字符串记住内容)。
您的解决方案的复杂性还取决于是否允许转义]的细节。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接