从字符串中提取最大的数字序列(正则表达式,还是?)

时间:2018-03-19 12:49:15

标签: regex vba vb6

我的字符串类似于以下内容:

 4123499-TESCO45-123
 every99999994_54

我想分别在每个字符串中提取最大的数字序列:

 4123499
 99999994

我之前尝试过正则表达式(我正在使用VB6)

 Set rx = New RegExp
 rx.Pattern = "[^\d]"
 rx.Global = True

 StringText = rx.Replace(StringText, "")

这让我在那里,但它只删除了非数字值,我最终看到第一个字符串:

412349945123

我可以找到能够满足我要求的正则表达式,还是我必须尝试其他方法?从本质上讲,我的模式必须是不是最长数字序列的任何东西。但我真的不确定这是否是一个合理的模式。有没有更好处理正则表达式的人能告诉我,如果我要去兔子洞吗?我感谢任何帮助!

4 个答案:

答案 0 :(得分:3)

你只能用正则表达式来获得结果。您必须使用其他编程方法提取所有数字块并获得最长的数据块。

以下是一个例子:

Dim strPattern As String: strPattern = "\d+"
Dim str As String: str = "4123499-TESCO45-123"
Dim regEx As New RegExp
Dim matches  As MatchCollection
Dim match As Match
Dim result As String

With regEx
     .Global = True
     .MultiLine = False
     .IgnoreCase = False
     .Pattern = strPattern
End With

Set matches = regEx.Execute(str)
For Each m In matches
  If result < Len(m.Value) Then result = m.Value
Next

Debug.Print result

带有\d+的{​​{1}}会找到所有数字块,然后在循环处理所有匹配后才会打印最长的数据块。

答案 1 :(得分:2)

这对RE本身无法解决。

相反,您可以简单地沿着追踪最长连续数字组的字符串:

@Entity
public class HousePrice {

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int housePrice_id;
private double housePrice;
private double latitude;
private double longitude;
private int number_of_houses;

//constructors

// getters & setters

(第一个结果赢得平局)

答案 2 :(得分:1)

如果您提供的两个示例属于以下标准:

  1. <long_number>-<some_other_data>-<short_number>
  2. <text><long_number>_<short_number>
  3. 字符串是否有两种格式,有一些解决方案。

    但是,如果您要搜索任何格式的任何字符串中最长的数字,这些都不起作用。

    解决方案1 ​​

    ([0-9]+)[_-].*
    

    请参阅demo

    在第一个捕获组中,您应该拥有这两种格式的最长编号。

    注意:这假设最长的数字将是它遇到下划线或连字符的第一个数字,与给出的两个示例相匹配。

    解决方案2

    \d{6,}
    

    请参阅demo

    注意:这假设最短的数字不会超过5个字符,最长的数字永远不会短于6个字符

答案 3 :(得分:1)

请尝试。
纯VB。 没有外部库或对象。
没有突破性的正则表达式模式 没有字符串操作,所以 - 速度。的超高速。比regexp :)更快<〜30倍 轻松改变各种需求。
例如,将源字符串中的所有数字连接到单个字符串。

此外,如果目标字符串只是中间步骤,则 因此,只能用数字进行操作。

Public Sub sb_BigNmb()
Dim sSrc$, sTgt$
Dim taSrc() As Byte, taTgt() As Byte, tLB As Byte, tUB As Byte
Dim s As Byte, t As Byte, tLenMin As Byte

    tLenMin = 4
    sSrc = "every99999994_54"

    sTgt = vbNullString

    taSrc = StrConv(sSrc, vbFromUnicode)
    tLB = LBound(taSrc)
    tUB = UBound(taSrc)

    ReDim taTgt(tLB To tUB)

    t = 0
    For s = tLB To tUB
        Select Case taSrc(s)
            Case 48 To 57
                taTgt(t) = taSrc(s)
                t = t + 1
            Case Else
                If CBool(t) Then Exit For   ' *** EXIT FOR ***
        End Select
    Next

    If (t > tLenMin) Then
        ReDim Preserve taTgt(tLB To (t - 1))
        sTgt = StrConv(taTgt, vbUnicode)
    End If

    Debug.Print "'" & sTgt & "'"
    Stop

End Sub

如何处理sSrc = "ev_1_ery99999994_54",请自己制作:)