如何隔离嵌套括号?

时间:2014-10-02 20:25:15

标签: regex

假设我有以下句子:

This is a (string) with lots of (brackets) and (to make ((the fun) complete) some are) even nested. 

我需要的是一种简单的方法来隔离所有内部括号,因为我需要用大括号替换它们。所以这个字符串如下

This is a (string) with lots of (brackets) and (to make {{the fun} complete} some are) even nested.

理论上,这意味着我需要一个正则表达式,在第一轮选择所有左括号前面的另一个左括号,所有右括号在下一轮中后跟另一个右括号。这样我就可以使用正则表达式替换来替换圆括号和大括号。

但我一直在努力......我尝试过这样的事情,但显然不起作用,有什么建议吗?

(?<=\([^()]*)\(

[编辑]

嗯,实际上我设法让它工作(使用VBA btw),但可能纯粹主义者可能不会留下深刻的印象,所以任何关于改进的建议总是受欢迎的。我采取了两步法,首先我将每个左括号替换为另一个左括号,然后用卷曲替换它。然后我替换右边的支架,前面是一个卷曲的支架。这个我循环......最后工作得很好,但当然只有在其他地方没有使用过卷曲的时候

Sub testMyFunc()
Call replaceNestedBrackets("This is a (comment in a) string folowed by a (nested and (more (complex)) with (blabla)) comment")
End Sub



Function replaceNestedBrackets(s As String) As String

Dim regEx As New RegExp
regEx.Global = True
Dim colregmatch As MatchCollection
Dim r1, r2 As String
r1 = "{"
r2 = "}"

regEx.Pattern = "(.*\([^)]*)(\()(.*)"

Set colregmatch = regEx.Execute(s)
If colregmatch.Count > 0 Then
    s = colregmatch.Item(0).SubMatches.Item(0) & r1 & colregmatch.Item(0).SubMatches.Item(2)

    regEx.Pattern = "([^{]*{[^\)]*)(\))(.*)"
    Set colregmatch = regEx.Execute(s)
    s = colregmatch.Item(0).SubMatches.Item(0) & r2 & colregmatch.Item(0).SubMatches.Item(2)

    replaceNestedBrackets (s)
End If
replaceNestedBrackets = s

Debug.Print replaceNestedBrackets
End Function

2 个答案:

答案 0 :(得分:1)

尝试

(\([^()]*)\(([^()]*)\)

替换为\1{\2}。 这将从内到外替换括号,因此您必须应用它直到它不再匹配。

See demo.

答案 1 :(得分:1)

如下面的代码那样,两步替换怎么样?为我的代码在Powershell中道歉,但它的正则表达式是重要的。

$x = "This is a (string) with lots of (brackets) and (to make ((the fun) complete) some are) even nested."
$x = $x -replace '(?<=\([^\)]+)\(', '{'
$x = $x -replace '\)(?=[^\(]+\))', '}'

未完全测试但适用于您的示例。