【问题标题】:RegExp other patterns not workingRegExp 其他模式不起作用
【发布时间】:2017-11-07 21:31:32
【问题描述】:

我继续尝试在 VBScript 和 VB6 中使用 RegExp 执行字符串格式匹配。我现在正在尝试匹配一个短的单行字符串,格式为:

  1. 七个字符:

    一个。六个字母数字加一个“-”或

    b.五个字母数字加两个“-”

  2. 三个数字

  3. 两个字母
  4. 文字“65”
  5. 两位十六进制数。

示例包括123456-789LM65F24EF789-012XY65A5A2345--789AB65D023456--890JK65D0

RegExp 模式([A-Z0-9\-]{12})([65][A-F0-9]{2}) 将 (1) - (3) 组合在一起,发现这些都可以。

但是,如果我尝试:

c) 使用模式 ([A-Z0-9\-]{10})([A-Z]{2})([65][A-F0-9]{2}) 中断 (3),

d) 使用模式([A-Z0-9\-]{7})([0-9]{3})([A-Z]{2})([65][A-F0-9]{2}) 拆分 (2) 和 (3),或

e) 使用交替模式([A-Z0-9]{5}[-]{2}|[A-Z0-9]{6}[-]{1})([0-9]{3})([A-Z]{2})([65][A-F0-9]{2}) 收紧 (1)

它拒绝找到任何一个。

我做错了什么?以下是运行和检查这些的 VBScript。

' VB Script
Main()

Function Main() ' RegEx_Format_sample.vbs
    'Uses two paterns, TestPttn for full format accuracy check & SplitPttn
    'to separate the two desired pieces

    Dim reSet, EtchTemp, arrSplit, sTemp
    Dim sBoule, sSlice, idx, TestPttn, SplitPttn, arrMatch 
    Dim arrPttn(3), arrItems(3), idxItem, idxPttn, Msgtemp

    Set reSet = New RegExp
    ' reSet.IgnoreCase = True ' Not using
    ' reSet.Global = True ' Not using

    ' load test case formats to check & split
    arrItems(0) = "0,6 nums + 1 '-',123456-789LM65F2" 
    arrItems(1) = "1,6 chars + 1 '-',4EF789-012XY65A5"
    arrItems(2) = "2,5 chars + 2 '-',A2345--789AB65D0"
    arrItems(3) = "3,5 nums + 2 '-',23456--890JK65D0"

    SplitPttn = "([A-Z0-9]{5,6})[-]{1,2}([A-Z0-9]{9})" ' split pattern has never failed to work

    ' load the patterns to try
    arrPttn(0) =  "([A-Z0-9\-]{12})([65][A-F0-9]{2})"
    arrPttn(1) =  "([A-Z0-9\-]{10}[A-Z]{2})([65][A-F0-9]{2})"
    arrPttn(2) =  "([A-Z0-9\-]{7})([0-9]{3})([A-Z]{2})([65][A-F0-9]{2})"
    arrPttn(3) =  "([A-Z0-9]{5}[-]{2}|[A-Z0-9]{6}[-]{1})([0-9]{3})([A-Z]{2})([65][A-F0-9]{2})"

    For idxPttn = 0 To 3 ' select Test pattern
        TestPttn = arrPttn(idxPttn)

        TestPttn = TestPttn & "[%]" ' append % "ender" char 
        SplitPttn = SplitPttn & "[%]" ' append % "ender" char 

        For idxItem = 0 To 3
            reSet.Pattern = TestPttn ' set to Test pattern
            sTemp = arrItems(idxItem )
            arrSplit = Split(sTemp, ",")  '  arrSplit is Split array
            EtchTemp = arrSplit(2) & "%" ' append % "ender" char to Item sub (2) as the "phrase" under test

            If reSet.Test(EtchTemp) = False Then
                MsgBox("RegEx " & TestPttn & " false for " & EtchTemp & " as " & arrSplit(1) )
            Else ' test OK; now switch to SplitPttn 
                reSet.Pattern = SplitPttn 
                Set arrMatch = reSet.Execute(EtchTemp) ' run Pttn as Exec this time
                If arrMatch.Count > 0 then ' If test OK then Count s/b > 0 
                    Msgtemp = ""
                    Msgtemp = "RegEx " & TestPttn & " TRUE for " & EtchTemp & " as " & arrSplit(1) 
                    For idx = 0 To arrMatch.Item(0).Submatches.Count - 1
                        Msgtemp = Msgtemp & Chr(13) & Chr(10) & "Split segment " & idx & " as " & arrMatch.Item(0).submatches.Item(idx) 
                    Next
                    MsgBox(Msgtemp)
                End If ' Count OK
            End If ' test OK
        Next ' idxItem 
    Next  ' idxPttn 
End Function

【问题讨论】:

  • “加号”是什么意思?连字符应该在末尾(第 7 位)还是位置 1 和 7 之间的任何位置?
  • 我认为以下内容对您来说效果很好(对您的条件列表采取了更直接的方法):([0-9A-Z]{5}--|[0-9A-Z]{6}-)[0-9]{3}[A-Z]{2}65[A-F0-9]{2}

标签: regex vbscript


【解决方案1】:

试试这个正则表达式:

(?:[A-Z0-9]{6}-|[A-Z0-9]{5}--)[0-9]{3}[A-Z]{2}65[0-9A-F]{2}

Click for Demo

说明:

  • (?:[A-Z0-9]{6}-|[A-Z0-9]{5}--) - 匹配 6 个字母数字字符后跟 - 或 5 个字母数字字符后跟 --
  • [0-9]{3} - 匹配 3 位数字
  • [A-Z]{2} - 匹配 2 个字母
  • 65 - 匹配 65 字面意思
  • [0-9A-F]{2} - 匹配 2 个 HEX 符号

你可以从下面的代码中得到一些想法:

VBScript 代码:

Option Explicit
Dim objReg, strTest
strTest = "123456-789LM65F2"          'Change the value as per your requirements. You can also store a list of values in an array and run the code in loop
set objReg = new RegExp
objReg.Global = True
objReg.IgnoreCase = True
objReg.Pattern = "(?:[A-Z0-9]{6}-|[A-Z0-9]{5}--)[0-9]{3}[A-Z]{2}65[0-9A-F]{2}"
if objReg.test(strTest) then
    msgbox strTest&" matches with the Pattern"
else
    msgbox strTest&" does not match with the Pattern"
end if
set objReg = Nothing

您的模式不起作用,因为:

([A-Z0-9\-]{12})([65][A-F0-9]{2}) - 匹配 12 次出现的 AlphaNumeric 字符或 - 后跟 任一 6 5 后跟 2 个 HEX 字符

([A-Z0-9\-]{10}[A-Z]{2})([65][A-F0-9]{2}) - 匹配 10 次出现的 AlphaNumeric 字符或 - 后跟 2 个字母后跟 either 6 5 后跟 2 个 HEX 字符

([A-Z0-9\-]{7})([0-9]{3})([A-Z]{2})([65][A-F0-9]{2}) - 匹配 7 次出现的 AlphaNumeric 字符或 -,后跟 3 个数字,后跟 2 个字母,后跟 或者 6 5,后跟 2十六进制字符

([A-Z0-9]{5}[-]{2}|[A-Z0-9]{6}[-]{1})([0-9]{3})([A-Z]{2})([65][A-F0-9]{2}) - 匹配出现 5 次 AlphaNumeric 字符后跟 -- 或出现 6 次 Alphanumeric 后跟 -。然后是 3 个数字,后跟 2 个字母,后跟 either 6 5,后跟 2 个 HEX 字符

【讨论】:

    【解决方案2】:

    试试这个模式:

    (([A-Z0-9]{5}--)|([A-Z0-9]{6}-))[0-9]{3}[A-Z]{2}65[0-9A-F]{2}
    

    或者,如果最后一部分不喜欢[A-F]

    (([A-Z0-9]{5}--)|([A-Z0-9]{6}-))[0-9]{3}[A-Z]{2}65[0-9ABCDEF]{2}
    

    【讨论】:

      【解决方案3】:

      所有,再次为您提供帮助!

      trincot,每个 arrItems() 中逗号之间的所有内容,包括“加号”,只是每个项目特征的简写描述的一部分,例如“5 个字符加 2 个破折号”。

      Gurman,您的 pttn 细分很有帮助,但是,如果我没看错的话,添加 ?前缀是“匹配零次或一次”,它必须完全匹配一次。此外,我的第一个模式(匹配 12)实际上确实适用于我的所有测试用例。

      jNevill 和 JMichelB 您的建议与我的最终结果非常接近。
      我是“过度分类”。经过一番修修补补,通过在我原来的交替模式中将 [65] 从 [] 中取出,我能够让 Test Pttn 成功识别这些测试用例。那就是我从([65])到(65)和Zammo!成功了。

      原始模式: ([A-Z0-9]{5}[-]{2}|[A-Z0-9]{6}[-]{1})([0-9]{3})([A-Z]{2})([65][A-F0-9]{2}) 体重模式: ([A-Z0-9]{5}[-]{2}|[A-Z0-9]{6}[-]{1})([0-9]{3})([A-Z]{2})(65)([A-F0-9]{2})

      哦,我移动了 SplitPttn = SplitPttn & "[%]" ' append % "ender" char 退出 For...Next 循环。这有助于分裂。

      丁字骨

      【讨论】:

      • 仅供参考,我的回答中的 ? 并不意味着 0 或 1 次出现。它与: 结合使用。我用?: 代替non-capturing group
      猜你喜欢
      • 1970-01-01
      • 2016-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-03
      • 1970-01-01
      • 2022-06-14
      相关资源
      最近更新 更多