1
[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

4 回答 4

0

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

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

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

每个号码将以 1 美元的形式返回。

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

如果 VBA 的 RegEx 不支持未捕获组(?:),请删除所有?:',您捕获的数字将改为 3 美元。

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

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

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

于 2013-08-28T05:39:48.903 回答
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

Fill [15-] with the other strings.

于 2013-08-28T06:09:24.217 回答
0

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

您可以使用此处所示的方法来提取省略初始方括号和最终方括号的子字符串,然后使用(如此Split所示)并使用破折号将字符串一分为二。最后,使用函数(如此所示)查看拆分产生的任何子字符串是否包含括号。Instr

如果任何子字符串包含方括号,则在添加中省略它们,否则将它们相加。

于 2013-08-28T05:46:00.097 回答
-2

好的!自问题发布以来已经过去了 6 年零 6 个月。不过,对于现在或将来正在寻找类似东西的人来说......

第 1 步: 修剪前导和尾随空格(如果有)

第 2 步: 查找/搜索:

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

用。。。来代替:

<Leave this field Empty>

第 3 步: 修剪前导和尾随空格(如果有)

第 4 步: 查找/搜索:

^-|-$

用。。。来代替:

<Leave this field Empty>

第 5 步: 查找/搜索:

-

用。。。来代替:

\+
于 2020-02-26T17:04:27.580 回答