我有一个字符串,希望从中删除具有以下属性的所有子字符串:
1. They start with an arbitrary (non-zero) number of open parenthesis
2. Then follows an arbitrary set of word characters (`\w`)
3. Then follows the same number of closing parenthesis as there have been open parenthesis.
纯正则表达式不能匹配开括号和闭括号.我第一次try wsa找到一种动态使用反向引用的方法.我知道这不是有效的Ruby,但给你一个 idea :
sttrep = str.gsub(/([(]+) \w+ [)]#{\1.size}/x, '')
当然是\1.大小无效;但是,有没有一种方法可以使用插值,在这种方法中,我可以基于反向参考来判断某些东西?
另一种可能是在循环中重复使用gsub
,并一次删除一级括号:
tmpstr = str
loop do
strrep = tmpstr.gsub(/[(] ([(]\w+[)]) [)]/x, "(\\1)")
if tmpstr == strrep
# We only have one level of parenthesis to consider
sttrep = str.gsub(/[(]\w+[)]/x, '')
break
else
tmpstr = strrep
end
end
# strrep is now the resulting string
然而,这似乎是一个过于复杂的解决方案.有什么 idea 吗(当然,除了编写owen字符串解析器,它循环遍历每个字符并计算括号)?
UPDATE:
示例1:
str = "ab((((cd))))ef((gh))ij(kl)mn"
strrep
应包含abefijmn.
示例2:
str = "((((abc));def;((ghi)))"
strrep
应包含(;def;).