首页 > 解决方案 > 在 VBA 中使用 RegEx 查找评级

问题描述

我承认我在 RegEx 方面很糟糕,而且我正在为这个 VBA 片段而苦苦挣扎。我正在尝试在评估等级(未达到、最低、达到、超过、杰出)旁边查找“x”,表明一个人获得了哪个等级。然后我需要在一个变量中捕获该评级。

我的输入文本如下所示:

/Not Met     /Minimal   /Met    xExceed    /Outstanding

此人获得了“超过”评级,因为他们前面有一个“x”。我有很多这些要解析,“x”可以在任何评级前面。

我正在查看较早的 RegEx 帖子以寻求帮助:

如何使用正则表达式

我正在尝试做一个像下面这样的模式,但这还不是很接近。我不知道如何查找“x”,确保它旁边的字母是大写的,然后捕获“x”之后和空格之前的所有文本。

Dim strPattern As String: strPattern = "[x]{1}[A-Z]{1}"

有什么建议,还是有更简单的非 RegEx 方法来做到这一点?

标签: vba

解决方案


这是一些 VBA 代码来完成您需要的一些测试用例:

Option Explicit

Private Sub Command1_Click()
   MsgBox GetRating("xNot Met     /Minimal   /Met    /Exceed    /Outstanding  ")
   MsgBox GetRating("/Not Met     /Minimal   /Met    xExceed    /Outstanding  ")
   MsgBox GetRating("/Not Met     /Minimal   /Met    /Exceed    xOutstanding  ")
   MsgBox GetRating("/Not Met     /Minimal   /Met    /Exceed    /Outstanding  ")
End Sub

Private Function GetRating(ByVal Evaluation As String) As String
   Dim i As Long, j As Long
   
   GetRating = "<na>"
   
   Do
      i = InStr(i + 1, Evaluation, "x")
      
      If i > 0 And Mid(Evaluation, i + 1, 1) = UCase(Mid(Evaluation, i + 1, 1)) Then
         j = InStr(i, Evaluation, "  ")
         
         If j > 0 Then
            GetRating = Mid(Evaluation, i + 1, j - i - 1)
            Exit Function
         End If
      End If
   Loop Until i = 0
End Function

有几点需要强调:

  1. 我将评级从“x”增加到 2 个空格,否则将无法正确返回“Not Met”。

  2. 为了简化编码,我在评估的末尾附加了 2 个空格。


推荐阅读