假设我有以下句子:
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
答案 0 :(得分:1)
答案 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 '\)(?=[^\(]+\))', '}'
未完全测试但适用于您的示例。