使用正则expression式从该string中提取不在括号内的数字

[15-] [41-(32)] [48-(45)] [70-15] [40-(64)] [(128)-42] [(128)-56] 

我有这些值,我想提取的值不是在括号中。 如果有多个,那么把它们加在一起。

什么是正则expression式来做到这一点?

所以解决scheme看起来像这样:

 [15-] -> 15 [41-(32)] -> 41 [48-(45)] -> 48 [70-15] -> 85 [40-(64)] -> 40 [(128)-42] -> 42 [(128)-56] -> 56 

正如@richardtallent所指出的那样,如果你使用正则expression式(至less在这种情况下),那么正则expression式不会支持math运算。

你可以使用这里所示的方法来提取一个子string,它省略了最初的和最后的方括号,然后使用Split (如图所示)并使用短划线将string拆分为两部分。 最后,使用Instr函数(如此处所示)来查看是否有任何拆分产生的子string包含括号。

如果任何一个子string包含一个括号,那么它们在加法中被省略,否则加起来。

正则expression式不支持对术语进行math运算。 你可以循环遍历匹配的组,并在正则expression式之外执行math运算。

下面是抽取方括号中不包含在括号中的数字的模式:

 \[ (?:(?:\d+|\([^\)]*\))-)* (\d+) (?:-[^\]]*)* \] 

每个号码将返回$ 1。

这是通过寻找一个数字,前缀是用破折号分隔的任意数量的“单词”,其中“单词”是数字本身或括号中的string,其次是,可选地,短划线和一些其他的东西,在结束之前支撑。

如果VBA的正则expression式不支持未捕获的组(?:) ,则删除所有?:的,并且捕获的数字将在$ 3中。

一个更简单的模式也适用:

 \[ (?:[^\]]*-)* (\d+) (?:-[^\]]*)* \] 

这只是查找由破折号分隔的数字,并允许数字在开始或结束。

 Private Sub regEx() Dim RegexObj As New VBScript_RegExp_55.RegExp RegexObj.Pattern = "\[(\(?[0-9]*?\)?)-(\(?[0-9]*?\)?)\]" Dim str As String str = "[15-]" Dim Match As Object Set Match = RegexObj.Execute(str) Dim result As Integer Dim value1 As Integer Dim value2 As Integer If Not InStr(1, Match.Item(0).submatches.Item(0), "(", 1) Then value1 = Match.Item(0).submatches.Item(0) End If If Not InStr(1, Match.Item(0).submatches.Item(1), "(", 1) And Not Match.Item(0).submatches.Item(1) = "" Then value2 = Match.Item(0).submatches.Item(1) End If result = value1 + value2 MsgBox (result) End Sub 

用其他琴弦填充[15-]。