【问题标题】:Grab a character using LEFT while ignoring specific characters使用 LEFT 抓取一个字符,同时忽略特定字符
【发布时间】:2015-02-23 14:01:51
【问题描述】:

好的,我知道您可以使用 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 函数来完成,但我假设这将是可行的方法,或者可能正则表达式可以一次清除所有这些?

谢谢!

【问题讨论】:

  • 真的不清楚你想要得到的字符串是什么。你说忽略“alpha”这个词并从数字开始,但你说结果只是“,”。

标签: regex vba ms-word


【解决方案1】:

这会将所有内容都放在空间的左侧:

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 以获取下一组数据,直到遇到另一个空格。您可以继续增加数字,直到它用完文本块。要找到最大块使用 ubound(Split(myTxt1, " "))

如果你一心想要使用 left 函数,你可以使用 instr (In String) 找到空格的数字 char:

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)

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

【讨论】:

  • 谢谢!这很好用,但恐怕我在此过程中遇到了一个完全不同的问题......看起来提到空间并不适用于所有情况,因为有时我会得到其他不必要的字符。你能想出一些可以简单地清除除数字、逗号和句号之外的所有内容的方法吗?或者简单地清除句号或逗号后两个空格的所有内容。 “number.##” 或 “number,##” 几乎是我最终需要的全部内容。还是我应该开始一个全新的问题?
  • nvm,通过研究这里的代码来完成它:link
【解决方案2】:

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

    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 读取一行文本。然后它通过chyaracter位置提取一列Arg(3)等是命令行参数3 =开始列,4 =结束列。

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

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

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

【讨论】:

  • 谢谢,但是您有什么方法可以解释并将其应用到我的示例中吗?这对我来说有点太多了。另外,我真的很想理解它,而不仅仅是复制/粘贴。
【解决方案3】:

这是我最后使用的解决方案。它包含 RegExp 功能,因此您必须在工具/参考中启用“Microsoft VBScript 正则表达式 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

在那之后,我用“左”功能追踪了“,”符号

Dim decSym As String
decSym = Left(Right(myValue, 3), 1)
MsgBox decSym 'shows ","

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 2013-12-11
    • 2023-03-22
    • 1970-01-01
    • 2019-05-18
    • 2021-07-24
    • 1970-01-01
    相关资源
    最近更新 更多