有谁知道如何只返回字符串中破折号两侧的数值?
例如,假设我们有以下字符串“Text, 2-78, 88-100, 101”。我正在寻找一种方法来识别破折号,然后返回其中一个数字(左或右)。
最后,我想检查一个给定的数字,比如 75,是否在字符串中注明的任何范围内。理想情况下,它会看到 75 落在“2-78”之内。
任何帮助将不胜感激!
转到工具-> 参考并检查“Microsoft VBScript 正则表达式 5.5”。然后你可以做这样的事情。(我知道这不是好的代码,但它的想法......)此外,这会找到所有 #-# 模式并为所有模式打印左数或右数(基于布尔值“left”是否为对或错)。
Dim str, res As String
str = "Text, 2-78, 88-100, 101"
Dim left As Boolean
left = False
Dim re1 As New RegExp
re1.Pattern = "\d+-\d+"
re1.Global = True
Dim m, n As Match
For Each m In re1.Execute(str)
Dim re2 As New RegExp
re2.Global = False
If left Then
re2.Pattern = "\d+"
Else
re2.Pattern = "-\d+"
End If
For Each n In re2.Execute(m.Value)
res = n.Value
If Not left Then
res = Mid(res, 2, Len(str))
End If
Next
MsgBox res
Next
您可以使用 VBA 以多种不同的方式执行此操作。使用 Split() 函数转换为数组,首先使用逗号作为分隔符,然后使用破折号可能是一种方法。
也就是说,如果您想要一种快速而肮脏的方式来使用 excel(您可以从中录制宏)来执行此操作,那么您可以这样做。
将目标字符串粘贴到单元格中。在其上运行 Text to Columns,使用逗号作为分隔符。复制您现在拥有的行并将粘贴转置到新工作表上。在转置列上再次运行 Text to Columns,这次使用破折号作为分隔符。您现在有并排的数字列,您可以根据需要将其与目标值进行比较。
您可能需要在某处使用 Trim() 函数来删除空格,但希望列中的文本会给您留下数字而不是文本数字。
最终,我认为有很多方法可以解决这类问题。这看起来是尝试使用 RegExp 的好方法。RegExp 不是我的专长,但我确实喜欢尝试用它来回答一些关于 SO 的问题。此代码已针对您的示例数据进行了测试,并且工作正常。
像这样,假设您的文本在 cell 中A1
,并且您正在测试一个类似的值75
,这也会在匹配集合中捕获字符串中的单个数字:
Sub TestRegExp
Dim m As Match
Dim testValue As Long
Dim rangeArray As Variant
testValue = 75 'or whatever value you're trying to find
pattern = "[\d]+[-][\d]+\b|[\d]+"
Set re = New RegExp
re.pattern = pattern
re.Global = True
re.IgnoreCase = True 'doesn't really matter since you're looking for numbers
Set allMatches = re.Execute([A1])
For Each m In allMatches
rangeArray = Split(m, "-")
Select Case UBound(rangeArray)
Case 0
If testValue = rangeArray(0) Then
msg = testValue & " = " & m
Else:
msg = testValue & " NOT " & m
End If
Case 1
If testValue >= CLng(rangeArray(0)) And testValue <= CLng(rangeArray(1)) Then
msg = testValue & " is within range: " & m
Else:
msg = testValue & " is not within range: " & m
End If
Case Else
End Select
MsgBox msg, vbInformation
Next
End Sub