0

有谁知道如何只返回字符串中破折号两侧的数值?

例如,假设我们有以下字符串“Text, 2-78, 88-100, 101”。我正在寻找一种方法来识别破折号,然后返回其中一个数字(左或右)。

最后,我想检查一个给定的数字,比如 75,是否在字符串中注明的任何范围内。理想情况下,它会看到 75 落在“2-78”之内。

任何帮助将不胜感激!

4

3 回答 3

1

转到工具-> 参考并检查“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
于 2013-09-11T19:52:36.910 回答
0

您可以使用 VBA 以多种不同的方式执行此操作。使用 Split() 函数转换为数组,首先使用逗号作为分隔符,然后使用破折号可能是一种方法。

也就是说,如果您想要一种快速而肮脏的方式来使用 excel(您可以从中录制宏)来执行此操作,那么您可以这样做。

将目标字符串粘贴到单元格中。在其上运行 Text to Columns,使用逗号作为分隔符。复制您现在拥有的行并将粘贴转置到新工作表上。在转置列上再次运行 Text to Columns,这次使用破折号作为分隔符。您现在有并排的数字列,您可以根据需要将其与目标值进行比较。

您可能需要在某处使用 Trim() 函数来删除空格,但希望列中的文本会给您留下数字而不是文本数字。

于 2013-09-11T19:42:00.370 回答
0

最终,我认为有很多方法可以解决这类问题。这看起来是尝试使用 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
于 2013-09-11T19:56:30.123 回答