从字符串中提取特定长度数字并使用这些数字创建新字符串

时间:2016-03-24 13:25:20

标签: excel excel-vba vba

我有一个文本字段,我需要从中提取某些数字。该数字总是7位数字,但字符串中的位置是未知的,字符串中的数字也是未知的。

样品串是“SF WO 1564892 DUE 5/19 FIN WO 1638964 DUE 5/27”。我希望能够提取1564892和1638964,并生成一个新的字符串,如“1564892; 1638964”,如果字符串中有更多,则继续添加“; number”。我使用新字符串来查找并返回这些数字中最大的一个。

我找到了这个并且它有点工作,但它也会从字符串“123456789”返回“1234567”,这是不受欢迎的。

Public Function ExtractDigits(Alphanumeric As String, DigitLength As Long)
Dim StringLenght As Long
Dim CurrentCharacter As String
Dim NewString As String
Dim NumberCounter As Long
Dim TempString As String


StringLenght = Len(Alphanumeric)
For r = 1 To StringLenght
    CurrentCharacter = Mid(Alphanumeric, r, 1)
    If IsNumeric(CurrentCharacter) Then
        NumberCounter = NumberCounter + 1
        TempString = TempString & CurrentCharacter
        If NumberCounter = DigitLength Then
            If NewString = "" Then
                NewString = TempString
            Else
            NewString = NewString & ";" & TempString
            End If
        End If
    End If
    If Not IsNumeric(CurrentCharacter) Then
        NumberCounter = 0
        TempString = ""
    End If
Next

ExtractDigits = NewString

End Function

我希望解决方案是在VBA而不是功能,但我对任何事情持开放态度。

4 个答案:

答案 0 :(得分:5)

使用using System.ComponentModel.DataAnnotations; public class Dog { [Key] public long Id { get; set; } public int? Age { get; set; } public string Name { get; set; } public float? Weight { get; set; } } 可以实现您想要的效果,但由于我正在走出去,所以这里是一个非常简单的替代:)

RegEx

修改

<强>逻辑

  1. 替换该字符串中任何不是任何字母的数字
  2. 替换该字母表的双重实例,直到只剩下一个
  3. 拆分该字母
  4. 循环并检查长度。
  5. 我已经显示了这些数字。你可以加入他们

答案 1 :(得分:2)

你可以使用Regex,它比循环整个字符串容易得多。

正在使用的正则表达式是\b\d{7}\b,这意味着由单词边界分隔的7位数字。

Public Function ExtractDigits(Alphanumeric As String, DigitLength As Long) As String
    Dim regEx As Object, matches As Object
    Dim i As Long
    Dim output As String

    Set regEx = CreateObject("VBScript.RegExp")
    With regEx
        .Global = True
        .MultiLine = True
        .IgnoreCase = False
        .pattern = "\b\d{" & DigitLength & "}\b"
    End With

    Set matches = regEx.Execute(Alphanumeric)
    For i = 0 To matches.Count - 1
        output = output & matches(i) & ";"
    Next
    If Len(output) > 0 Then output = Left(output, Len(output) - 1)
    ExtractDigits = output
End Function

答案 2 :(得分:1)

你的问题是否可以通过添加一个额外的If语句来解决,该语句测试第7个数字后面的字符是否也是一个数字,如果是这样则忽略该数字?

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<h1 id="heading" style="position:absolute;">Watch the moving heading!</h1>

答案 3 :(得分:1)

我过去遇到过这样的事情,并希望这种方法有所帮助。

app.controller('myCtrl', function($scope, factoryResource) {
    $scope.resource = factoryResource.getResource('http://localhost:8080/api/v1/projects');
    $scope.resource.save(object, successCallback, errorCallback); //post
    $scope.resource.query(successCallback, errorCallback); //get all
    $scope.resource.get({id: object.id}, successCallback, errorCallback); //get a specific object
    $scope.resource.delete({id: object.id}, successCallback, errorCallback); //delete
}

最佳。