Regex 使用正则表达式识别设备ID号-VBA

Regex 使用正则表达式识别设备ID号-VBA,regex,vba,Regex,Vba,试图构造一个Regexp来识别设备编号,我需要它以多种格式识别设备编号,包括合并的设备编号,例如AFD21101或AFD21101-02-03或AFD21101-2-3,包括测试数据中的各种前缀 欢迎提供任何提示或反馈,对于每个场景使用多个RegExp可能会更容易,但我希望有一个master,它可以识别这些模式中的任何一种,并能够从字符串中提取,以便以更详细的顺序进行进一步的处理。可能转换为长格式等 非常感谢您的帮助。希望我能报答你 到目前为止,我所尝试的: ^[abcpfsmschafddfc

试图构造一个Regexp来识别设备编号,我需要它以多种格式识别设备编号,包括合并的设备编号,例如
AFD21101
AFD21101-02-03
AFD21101-2-3
,包括测试数据中的各种前缀

欢迎提供任何提示或反馈,对于每个场景使用多个RegExp可能会更容易,但我希望有一个master,它可以识别这些模式中的任何一种,并能够从字符串中提取,以便以更详细的顺序进行进一步的处理。可能转换为长格式等

非常感谢您的帮助。希望我能报答你

到目前为止,我所尝试的:

^[abcpfsmschafddfcpdcdplldt][glvmdugmrxftiichlewsnuabn][mmrprbdpucdsxtvuwcrslbubk][0-9][0-9xX][0-9xX][0-9xX][0-9xX]|[0-9xX-][0-9]|[0-9]

^[abcpfsmschafddfcpdcdplldt][glvmdugmrxftiichlewsnuabn][mmrprbdpucdsxtvuwcrslbubk][0-9][0-9xX][0-9xX][0-9xX][0-9xX]

^(BLM)|(SUB)|

(CVR)|FDR|SMP|CRU|HXC|ATS|AFD|FTS|DIX|DIT|FIT|FCV|KV|FV|CHU|PLW|BCR|DEC|CTR|CWR|V|DSS|PNL|MTR|LUB|LAU|CCL|DBB|TNK|THK|PIT|[0-9][0-9xX][0-9xX][0-9xX][0-9xX]
Testdata-必须按照下面的Testdata示例处理多个以逗号或多行分隔的数据

// Example test data 1: (CSV+)
CRN21003 (CB-3), CRN21004 (CB-4)

// Example test data 2: (CSV)
CVR21404, CHU21437, AFD21401

// Example test data 3: (Multi-line)
MGD22401 - 16
DEC22401 - 16

// Example test data 4: (In string)
AFD11122 SOME OTHER RANDOM DATA WDC11121_22 SOME OTHER RANDOM DATA 

//Additional matches
AFD21101-03
AFD21101_03
AFD21101-02-03
AFD21101_02_03
AFD21101-2-3
AFD21101_2_3
FDR21407-08
BLM21401
SUB21601
CVR21601
Fdr21601
SMP21501
CRU21501
HXC21501
AFD21501
FTS21X01
DIX21301
DIT22501
FIT21X0X
FCV21501
模式:

  • 基数最多为8位

  • 1-3个字母(A-Z)
  • 5位数字(0-9),包括X作为通配符
  • 然后是集合设备ID

     e.g. AFD21101-2-3, AFD21101-02-03 or AFD21101_02_03
    
  • \uuu
    -
    是分隔符,表示缩写的后续设备id或范围
  • AFD21101-02-03
    等同于
    AFD21101
    AFD21102
    AFD21103
    的完整形式
  • 可能的前缀是continue

    KV
    CHU
    PLW
    BCR
    DEC
    CTR
    CWR
    V
    DSS
    PNL
    MTR
    LUB
    LAU
    CCL
    DBB
    TNK
    THK
    PIT
    AGM2XXXX - valid
    
    某些无效匹配可能类似于


    AGM211011
    AGMXXXXX
    21101
    2110
    AGM21101-094-034
    AGM
    (仅前缀不带尾随的5位数字/X通配符)

    如果我了解您的问题,您需要获取以提供的子字符串开头并包含数字的字符串

    你可以试试下面的正则表达式

    ^(?:BLM|SUB|CVR|FDR|SMP|CRU|HXC|ATS|AFD|FTS|DIX|DIT|FIT|FCV|KV|FV|CHU|PLW|BCR|DEC|CTR|CWR|V|DSS|PNL|MTR|LUB|LAU|CCL|DBB|TNK|THK|PIT)[0-9_-]+
    
    详细信息:

  • ^
    :字符串的开头
  • ?:
    :非捕获组
  • (代码)码>(《代码?)码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码>码PIT):前缀列表

  • 你打算做什么还不是100%清楚,因为:

  • 您提供的测试数据完全由预期匹配组成
  • 预期产出尚不清楚。虽然这在很大程度上可以追溯到第1点 但是,有很多方法可以获得您需要的信息。它们都取决于源数据的组织方式

    //  Example test data 1:
    
    AFD11122 SOME OTHER RANDOM DATA
    WDC11121_22 SOME OTHER RANDOM DATA
    
    //  Example test Data 2:
    
    SOME RANDOM DATA AFD11122 AND SOME MORE RANDOM DATA WDC11121_22 WITH SOME MORE
    
    假设数据位于字符串的开头,并且希望捕获每个字符串作为一个整体:

    // Option 1
    /^(.*?)\s/
     ^            : Start of string
      (.*?)       : Non-greedy capture group
           \s     : First space (first because the capture group was non-greedy)
    
    // Option 2
    /^([ABCDEFHIKLMNPRSTUVWX][ABCDEFHILMNRSTUVWX]?[BCDKLMPRSTUVWX]?[x\d]{5}[_\-\d]*)/i
     ^                                                                                    : Start of string
      (                                                                                   : Start of capture group
       [ABCDEFHIKLMNPRSTUVWX]                                                             : Capture any letter in character set
                             [ABCDEFHILMNRSTUVWX]?                                        : OPTIONALLY [?] capture any letter in character set
                                                  [BCDKLMPRSTUVWX]?                       : OPTIONALLY [?] capture any letter in character set
                                                                   [x\d]{5}               : Capture any number or x 5 times
                                                                           [_\-\d]*       : Capture any number, hyphen, or underscore until you reach a character not in the set
                                                                                   )      : End of capture group
                                                                                     i    : FLAG - case insensitive
    
    // Option 3
    /^((?:AFD|BCR|BLM....TNK|V)[\d_\-]*)/i
     ^                                         : Start of string
      (                                        : Start of capture group
       (?:                                     : Start of non-capturing group
          AFD|BCR|BLM....TNK|V                 : List of prefixes separated with "|"
                              )                : End of non-capturing group
                               [\d_\-]*        : Capture any number, hyphen, or underscore until you reach a character not in the set
                                       )       : End of capture group
                                          i    : FLAG - case insensitive
    
    // Option 4
    /^([a-z]{1,3}[x\d]{5}[_\-\d]*)/i    :
     ^                                  : Start of string
      (                                 : Start of capture group
       [a-z]{1,3}                       : Capture any letter [range: a-z] 1 to 3 times {1,3}
                 [x\d]{5}               : Capture any number [\d] or x [x] 5 times {5}
                         [_\-\d]*       : Capture any number, hyphen, or underscore until you reach a character not in the set
                                 )      : End of capture group
                                   i    : FLAG - case insensitive
    
    根据您对主要问题的更新,我将坚持使用
    选项4
    ,除非您特别需要确保仅匹配设置的前缀

    如果您的数据看起来更像
    示例数据2
    ,则需要相应地修改上述表达式;以下是一些例子:

    /([a-z]{1,3}[x\d]{5}[_\-\d]*)/i        : Remove the ^
    /\b([a-z]{1,3}[x\d]{5}[_\-\d]*)/i      : Add a word boundary to the start of the expression
    /[^a-z]([a-z]{1,3}[x\d]{5}[_\-\d]*)/i  : Start the expression with anything BUT a letter
    
    您如何更改它将取决于您正在搜索的数据

    根据最新问题编辑更新了RegEx

    /([a-z]{1,3}(?!xxxxx)[x\d]{5}(?!\d)[_\-\d]*)/ig
    
    试试这个:

    [A-Z]{1,3}[\dX]{5}([_-])0?\d(\10?\d)?
    
    这要求通过捕获分隔符并使用对其的反向引用,使分隔符保持一致,即两者都是
    -
    或两者都是
    -
    ,尽管第二个“池ID”是可选的


    据我所知,这与您的所有示例都匹配。

    您能否提供测试数据的预期输出?对于列出的任何前缀,预期输出将是设备ID,即AFD21101或集合ID AFD21101-02-03。因此,TestData中的所有值都应匹配?那么什么不应该匹配呢?请把问题说得更具体一点,这样我们就有更好的机会提供帮助。也许值得检查一下uu是否真的被排除在外,以及在您显示的字符集中,是否确实有一个预期的顺序,即在连字符之前的数字。谢谢,是的,数字或X的通配符必须在连字符或下划线之前。我们有一些解释,我已经通过匹配运行了您的示例,但它似乎与我使用逗号分隔多个设备ID或多行分隔的情况不匹配。我用更多的例子更新了testdata。希望这能帮助你更多地了解我正在努力实现的目标。嗯,你能添加你期望从测试数据中获得的匹配吗?如果我使用正则表达式
    ([a-z]{1,3}[x\d]{5}[\u \-\ d]*)
    ,我应该得到我期望的所有匹配项。如果你只得到一个(即第一个),那么也许你需要
    g:global
    标志以及
    i:case-sensitive
    我知道你在起诉VBA-为了让VBA返回比第一个匹配更多的值,你必须将
    global
    选项设置为
    True
    regexObject.global=True
    。类似地,
    i:case-sensitive
    标志由
    regexObject.IgnoreCase=True
    激活(其中
    regexObject
    是新RegExp()的变量名)您还必须让我知道为什么
    AGM21101-094-034
    不匹配,以及第一部分
    AGM21101
    是否仍应匹配?