使用 LEFT 抓取一个字符,同时忽略特定字符

Grab a character using LEFT while ignoring specific characters

好的,我知道你可以使用 LEFT 函数抓取任何字符:

Left(Right(A,3),1)

(非常感谢 Serenity 给我看这个)

我想弄清楚的是,如果你有这样设置的变量:

myTxt1 = "2513,82 alpha"
myTxt2 = "999,71 somekindofexpression"
myTxt3 = "55,7 orange"

...你如何让他们出来:

myTxt1 = "2513,82"
myTxt2 = "999,71"
myTxt3 = "55,7"

之后我可以使用上面提到的 Left(Right(A,3),1) 代码轻松抓取“,”。

所有这些都不必使用 LEFT 函数来完成,但我假设这是可行的方法,或者可能正则表达式可以一次清除所有内容?

谢谢!

这是我寻找数字的一些代码,最终从字符串中删除所有非数字(以及非小数和非逗号)字符,直到我找到一个可识别的数字。

    Lne = Inp.readline
    SortKey = Mid(Lne, LCase(Arg(3)), LCase(Arg(4)) - LCase(Arg(3)))
    If IsNumeric(Sortkey) = False then
        Set RE = new Regexp
        re.Pattern = "[^0-9\.,]"
        re.global = true
        re.ignorecase = true
        Sortkey = re.replace(Sortkey, "")
    End If
    If IsNumeric(Sortkey) = False then
        Sortkey = 0
    ElseIf Sortkey = "" then
        Sortkey = 0
    ElseIf IsNull(Sortkey) = true then
        Sortkey = 0
    End If
    .AddNew
    .Fields("SortKey").value = CSng(SortKey)
    .Fields("Txt").value = Lne
    .UpDate
Loop

它来自一个更大的程序。

它从 StdIn 读取一行文本。然后它通过字符位置提取列 Arg(3) 等是命令行参数 3 = 开始列,4 = 结束列。

它测试提取的列是否为数字。如果不是,它会搜索并替换所有非 0-9、逗号或小数的字符。

然后我测试它现在是否是一个数字,如果不是我设置为 0,否则我转换为单一数据类型。

对你来说是搜索和替换,你只剩下数字、小数点和逗号。

这将获取 space 左侧的所有内容:

Sub myTxt()
'Set the strings according to your post
myTxt1 = "2513,82 alpha"
myTxt2 = "999,71 somekindofexpression"
myTxt3 = "55,7 orange"
'Split the strings to an array using a space as the delimiter then assign the first element to the variable
myTxt1 = Split(myTxt1, " ")(0)
myTxt2 = Split(myTxt2, " ")(0)
myTxt3 = Split(myTxt3, " ")(0)
'Display the results
MsgBox "myTxt1 = " & myTxt1 & vbLf & "myTxt2 = " & myTxt2 & vbLf & "myTxt3 = " & myTxt3
End Sub

将 0 更改为 1 以获得下一组数据,直到遇到另一个 space。您可以不断增加数字,直到它用完文本块。要查找最大块,请使用 ubound(Split(myTxt1, " "))

如果您决定使用 left 函数,您可以使用 instr (In String) 找到 space 的数字字符:

instr(1,myTxt1," ")

然后您可以将其与左函数结合起来,如下所示:

Left(myText,instr(1,myTxt1," ")-1) 'Remove 1 to get rid of the space from the returned string

最后,您可以在此处使用数组来允许可扩展的输入量,如下所示:

Sub myTxt2()
Dim myTxt As Variant, X As Long
'Input your data to an array (Comma seperate your values)
myTxt = Array("2513,82 alpha", "999,71 somekindofexpression", "55,7 orange")
'Loop through the array one element at a time
For X = LBound(myTxt) To UBound(myTxt)
    'Replace the element with just the first chunk of the value
    myTxt(X) = Split(myTxt(X), " ")(0)
Next
'Display results
MsgBox Join(myTxt, vbLf)
End Sub

您的数据仍然可以访问,但不再是 myTxt1、myTxt2、myTxt3,现在分别是 myTxt(1)、myTxt(2)、myTxt(3)

希望这对您现在和将来有所帮助。

这是我最后使用的解决方案。它包括 RegExp 功能,因此您必须在 Tools/References.

中启用 "Microsoft VBScript Regular Expressions 5.5"
Dim myVal as Variant
Dim colMatches As MatchCollection
Dim objMatch As Match

myVal = "We've earned €20.000,00 last night."

Set rgex = New RegExp
    rgex.Pattern = "[0-9].*[0-9]"
Set colMatches = rgex.Execute(myValue)
For Each objMatch In colMatches
      myValue = objMatch.Value
MsgBox myValue 'shows "20.000,00"
Next

之后,我用 "Left" 函数

追踪了“,”符号
Dim decSym As String
decSym = Left(Right(myValue, 3), 1)
MsgBox decSym 'shows ","