【问题标题】:Test string format [closed]测试字符串格式[关闭]
【发布时间】:2018-12-03 11:07:38
【问题描述】:

如何测试字符串是否为以“R”开头,后跟最多 8 个数字的格式?

【问题讨论】:

  • 这是一个非常广泛的问题,上下文非常有限。尝试提供更多有关您的问题以及您迄今为止尝试过的内容的详细信息? This 可能是解决您问题的一种方式。
  • 谢谢。我想在激活单元格时触发某个操作,但前提是它包含某种格式的字符串。我打算使用InStr,但我不知道如何适应它。
  • 逐个字符测试;使用Like 运算符;常用表达。有各种各样的测试方法。
  • 假设您希望在“R”之后至少有 1 个数字,您可以使用以下代码进行测试:debug.print test_string like "R#*" and len(test_string) <10

标签: excel vba


【解决方案1】:

这很容易使用正则表达式完成。

Function testString(ByVal tstStr As String) As Boolean

    With CreateObject("VBScript.RegExp")
        .Pattern = "^R\d{0,8}$"
        .IgnoreCase = False
        testString = .test(tstStr)
    End With

End Function

如果tstStr 与您的.Pattern 匹配,则.test() 返回一个布尔值。

分解模式^R\d{0,8}$

  • ^ 字符串开始
  • R 匹配文字 R
    • 如果你还可以匹配小写r,那么你可以设置IgnoreCase = True
  • \d 匹配一个数字 0-8 次 {0,8}
  • $ 匹配字符串结尾

由于这是一个函数,你可以测试任何输入字符串

Debug.Print testString("R123456")
Rem: Prints 'True'

【讨论】:

  • 谢谢。由于我只会使用一次,我可以将它从函数中取出并针对 ActiveCell.Value 进行测试吗?
  • 我坚信专用代码应该是自包含的。当然,如果您选择这样做,您可以通过 = .test(ActiveCell.Value) 执行此操作。如果你保留它一个函数,你也可以使用testString(ActiveCell.value)
  • 这样做会更快。如果您在启用速度优化的情况下进行编译,它将使函数内联。
【解决方案2】:

请参阅https://theburningmonk.com/2012/05/performance-test-string-contains-vs-string-indexof-vs-regex-ismatch/,了解为什么 RegEx 不是简单任务的最佳选择。

Str = "R12345678"
If Left(Str,1) = "R" then 
    if IsNumeric(Mid(Str, 2)) then 
        MsgBox "Match"
    End If
End If

【讨论】:

  • 我会在第二个之前添加And len(Str) <= 9,然后完全涵盖OP的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多