使用正则表达式从该字符串中提取不在括号中的数字[70-(90)]

时间:2013-08-28 05:30:44

标签: regex excel vba

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

我有这些值,我想要提取不在卷曲括号中的值。如果有多个,则将它们一起添加。

执行此操作的正则表达式是什么?

所以解决方案看起来像这样:

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

4 个答案:

答案 0 :(得分:0)

正则表达式不支持对术语执行数学运算。您可以遍历匹配的组并在Regex之外执行数学运算。

这是在方括号内提取任何不在cury括号中的任何数字的模式:

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

每个号码将以1美元的价格退回。

这可以通过查找以破折号分隔的任意数量的“单词”作为前缀的数字来实现,其中“单词”是数字本身或带括号的字符串,然后可选地,之后是破折号和其他一些东西击中末端支撑。

如果VBA的RegEx不支持未被捕获的群组(?:),请移除所有?:,并且您捕获的号码将以3美元的价格代替。

更简单的模式也有效:

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

这只是查找由破折号分隔的数字,并允许数字位于开头或结尾。

答案 1 :(得分:0)

如果你采用正则表达式方法(至少在这种情况下),你会过于复杂化,正如@richardtallent所指出的那样,正则表达式不支持数学运算。

您可以使用显示here的方法来提取省略初始和最后方括号的子字符串,然后使用Split(如图here所示)并拆分两个字符串使用短划线标志。最后,使用Instr函数(如图here所示)查看split产生的任何子字符串是否包含括号。

如果任何子字符串包含一个括号,那么它们将从添加中省略,否则它们会被添加。

答案 2 :(得分:0)

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-]。

答案 3 :(得分:-2)

好!自问题发布以来已经6年零6个月了。尽管如此,对于任何正在寻找这样的东西的人,也许现在还是将来...

步骤1: 修剪前导和尾随空格

步骤2: 查找/搜索:

\]|\[|\(.*\)

替换为:

<Leave this field Empty>

第3步: 修剪前导和尾随空格

步骤4: 查找/搜索:

^-|-$

替换为:

<Leave this field Empty>

第5步: 查找/搜索:

-

替换为:

\+