Excel中的Regexpmatch- 5个以上字符匹配

fcg9iug3  于 2022-12-30  发布在  其他
关注(0)|答案(1)|浏览(84)

我需要帮助找到5+字符模式之间的2个单元格在同一工作表。
我在网上找到了建立示例代码的信息,我想我可以调整它来修复,但不起作用。有人能帮助我吗?
以下是我希望实现的目标:

下面是我在C栏中输入的公式:

=Regexpmatch(A1:B1,"^[\S]{5}")

Visual Basic中的代码:模块1(代码)

Public Function RegExpMatch(input_range As Range, pattern As String, Optional match_case As Boolean =    True) As Variant
  Dim arRes() As Variant 'array to store the results
  Dim iInputCurRow, iInputCurCol, cntInputRows, cntInputCols As Long 'index of the current row in the source range, index of the current column in the source range, count of rows, count of columns

  On Error GoTo ErrHandl

      RegExpMatch = arRes

      Set regEx = CreateObject("VBScript.RegExp")
      regEx.pattern = pattern
      regEx.Global = True
      regEx.MultiLine = True
      If True = match_case Then
        regEx.ignorecase = False
      Else
        regEx.ignorecase = True
      End If

      cntInputRows = input_range.Rows.Count
      cntInputCols = input_range.Columns.Count
      ReDim arRes(1 To cntInputRows, 1 To cntInputCols)

      For iInputCurRow = 1 To cntInputRows
        For iInputCurCol = 1 To cntInputCols
      arRes(iInputCurRow, iInputCurCol) = regEx.Test(input_range.Cells(iInputCurRow, iInputCurCol).Value)
    Next
      Next

      RegExpMatch = arRes
  Exit Function
    ErrHandl:
    RegExpMatch = CVErr(xlErrValue)
    End Function
    Sub Run()

    End Sub

我把这个公式放入C列,在C列和D列都收到了结果。但是,我不知道它甚至拉了什么,因为C列中的所有值都是真的,我看不出为什么我收到了假的模式或原因。

4bbkushb

4bbkushb1#

正则表达式模式将只返回基于字符串中前五个非空格字符的匹配项。
在我看来,如果两个字符串中存在匹配的Words,并且这些单词的长度为5个或更多字符,那么您真正想要做的是返回TRUE
如果不是,请澄清。

  • 将每个字符串拆分为单词列表或数组
  • 对于第1列,***单词***由@.或从小写字母到大写字母的转换分隔。
  • 对于第2列,***单词***由Space分隔
  • 筛选每个列表以仅保留包含五个或更多字符的单词
  • 检查一个单词是否同时出现在两个列表中。

这可以使用VBA和/或Power Query完成。
下面是一个Power Query解决方案:在Windows Excel 2010+和Excel 365(Windows或Mac)中提供电源查询
使用增强查询的步骤

  • 选择数据表中的某个单元格
  • Data => Get&Transform => from Table/Range
  • PQ编辑器打开时:Home => Advanced Editor
  • 记录第2行中的表名称
  • 将下面的M代码粘贴到您看到的位置
  • 将第2行中的Table名称改回最初生成的名称。
  • 阅读评论并探索Applied Steps以了解算法
    • M代码**
let

//Change next line to reflect actual data source
    Source = Excel.CurrentWorkbook(){[Name="Table21"]}[Content],

//Set the data types
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Column1", type text}, {"Column2", type text}}),

//Add custom column
    #"Added Custom" = Table.AddColumn(#"Changed Type", "Match", each 
        let 

/*Split column 1 by 
  Transition from lower case to upper case character.
  Then by `@` or `.`
    Filter to include only words with five or more characters*/
            #"Split Col1" = 
                List.Select(
                    List.Combine(
                        List.Transform(
                            Splitter.SplitTextByCharacterTransition({"a".."z"},{"A".."Z"})([Column1]), 
                            each Text.SplitAny(_,"@."))), each Text.Length(_)>=5),

/*Split Column 2 by <space>
    Filter to include only words with length >=5*/
            #"Split Col2" = 
                List.Select(
                    Text.Split([Column2]," "), 
                    each Text.Length(_)>=5),

/*Create a List of words that are in both of the above lists
   If there are one or more words in the Intersection of the two lists
   then True, else False*/
            Match = 
                List.Intersect(
                    {#"Split Col1",#"Split Col2"},Comparer.OrdinalIgnoreCase)
        in 
            List.Count(Match) > 0, type logical)
in
    #"Added Custom"

相关问题