[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
答案 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步: 查找/搜索:
-
替换为:
\+