首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >匹配中的vbscript匹配

匹配中的vbscript匹配
EN

Stack Overflow用户
提问于 2012-02-04 05:38:07
回答 2查看 361关注 0票数 1

大家好。

我正在路由器上运行一些Cisco show命令。我正在将输出捕获到一个数组中。我想使用正则表达式在输出中查找某些信息。正则表达式的工作方式是找到包含它的行,但是没有足够的唯一信息可以用来创建我的正则表达式,所以我最终得到了更多我想要的信息。下面是输出:

代码语言:javascript
复制
 ROUTERNAME#sh diag 
Slot 0:
        C2821 Motherboard with 2GE and integrated VPN Port adapter, 2 ports
        Port adapter is analyzed 
        Port adapter insertion time 18w4d ago
        Onboard VPN             : v2.3.3
        EEPROM contents at hardware discovery:
        PCB Serial Number        : FOC1XXXXXXXXX
        Hardware Revision        : 1.0
        Top Assy. Part Number    : 800-26921-04
        Board Revision           : E0
        Deviation Number         : 0
        Fab Version              : 03
        RMA Test History         : 00
        RMA Number               : 0-0-0-0
        RMA History              : 00
        Processor type           : 87 
        Hardware date code       : 20090816
        Chassis Serial Number    : FTXXXXXXXXXX
        Chassis MAC Address      : 0023.ebf4.5480
        MAC Address block size   : 32
        CLEI Code                : COMV410ARA
        Product (FRU) Number     : CISCO2821      
        Part Number              : 73-8853-05
        Version Identifier       : V05 
        EEPROM format version 4
        EEPROM contents (hex):
          0x00: 04 FF C1 8B 46 4F 43 31 33 33 33 31 4E 36 34 40
          0x10: 03 E8 41 01 00 C0 46 03 20 00 69 29 04 42 45 30
          0x20: 88 00 00 00 00 02 03 03 00 81 00 00 00 00 04 00
          0x30: 09 87 83 01 32 8F C0 C2 8B 46 54 58 31 33 33 36
          0x40: 41 30 4C 41 C3 06 00 23 EB F4 54 80 43 00 20 C6
          0x50: 8A 43 4F 4D 56 34 31 30 41 52 41 CB 8F 43 49 53
          0x60: 43 4F 32 38 32 31 20 20 20 20 20 20 82 49 22 95
          0x70: 05 89 56 30 35 20 D9 02 40 C1 FF FF FF FF FF FF

AIM Module in slot: 0
        Hardware Revision        : 1.0
        Top Assy. Part Number    : 800-27059-01
        Board Revision           : A0
        Deviation Number         : 0-0
        Fab Version              : 02
        PCB Serial Number        : FOXXXXXXXXX
        RMA Test History         : 00
        RMA Number               : 0-0-0-0
        RMA History              : 00
        Product (FRU) Number     : AIM-VPN/SSL-2
        Version Identifier       : V01
        EEPROM format version 4
        EEPROM contents (hex):
          0x00: 04 FF 40 04 F4 41 01 00 C0 46 03 20 00 69 B3 01
          0x10: 42 41 30 80 00 00 00 00 02 02 C1 8B 46 4F 43 31
          0x20: 33 33 31 36 39 59 55 03 00 81 00 00 00 00 04 00
          0x30: CB 8D 41 49 4D 2D 56 50 4E 2F 53 53 4C 2D 32 89
          0x40: 56 30 31 00 D9 02 40 C1 FF FF FF FF FF FF FF FF
          0x50: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
          0x60: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
          0x70: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF

我要捕获的是'Product (FRU) Number:‘部分中包含的型号。在本例中为'CISCO2821‘。我只想输出或MsgBox CISCO2821,尽管其他可能是'CISCO2911/K9‘或类似的东西。

这是我正在使用的regex模式:

代码语言:javascript
复制
Product\s\(FRU\)\sNumber\s*:\s*CIS.*

使用正则表达式测试工具,我能够匹配包含我想要的内容的整行,但我只想写出型号。

我看了一下'ltrim‘和'rtrim’,但我不认为这是可行的。

任何帮助都将不胜感激。

致以问候。

EN

回答 2

Stack Overflow用户

发布于 2012-02-04 05:48:43

好吧,这是用VB.NET编写的,而不是vbscript,但这可能会帮助你上路:

代码语言:javascript
复制
Dim RegexObj As New Regex("Product\s\(FRU\)\sNumber[\s\t]+:\s(CIS.+?)$", RegexOptions.IgnoreCase Or RegexOptions.Multiline)
ResultString = RegexObj.Match(SubjectString).Groups(1).Value
票数 1
EN

Stack Overflow用户

发布于 2012-02-04 07:09:02

投资两个小帮手函数:

代码语言:javascript
复制
Function qq(sT) : qq = """" & sT & """" : End Function

Function newRE(sP, sF)
  Set newRE = New RegExp
  newRE.Pattern = sP
  newRE.Global     = "G" = Mid(sF, 1, 1)
  newRE.IgnoreCase = "I" = Mid(sF, 2, 1)
  newRE.MultiLine  = "M" = Mid(sF, 3, 1)
End Function

并使用

代码语言:javascript
复制
  ' 3 ways to skin this cat
  Dim sInp : sInp = Join(Array( _
      "CLEI Code: COMV410ARA" _
    , "Product (FRU) Number : CISCO2821" _
    , "Part Number:73-8853-05" _
  ), vbCrLf) ' or vbLf, vbCr 
  WScript.Echo sInp
  ' (1) just search for CIS + sequence of non-spaces - risky if e.g. CLEI Code starts with CIS
  WScript.Echo 0, "=>", qq(newRE("CIS\S+", "gim").Execute(sInp)(0).Value)
  ' (2) use a capture/group (idea stolen from skyburner; just 'ported' to VBScript)
  WScript.Echo 1, "=>", qq(newRE("\(FRU\)[^:]+:\s(\S+)", "gim").Execute(sInp)(0).Value)
  WScript.Echo 2, "=>", qq(newRE("\(FRU\)[^:]+:\s(\S+)", "gim").Execute(sInp)(0).SubMatches(0))
  ' (3) generalize & use a Dictionary
  Dim dicProps : Set dicProps = CreateObject("Scripting.Dictionary")
  Dim oMT
  For Each oMT in newRe("^\s*(.+?)\s*:\s*(.+?)\s*$", "GiM").Execute(sInp)
      Dim oSM : Set oSM = oMT.SubMatches
      dicProps(oSM(0)) = oSM(1)
  Next
  Dim sName
  For Each sName In dicProps.Keys
      WScript.Echo qq(sName), "=>", qq(dicProps(sName))
  Next

要获得此输出,请执行以下操作:

代码语言:javascript
复制
CLEI Code: COMV410ARA
Product (FRU) Number : CISCO2821
Part Number:73-8853-05
0 => "CISCO2821"
1 => "(FRU) Number : CISCO2821"
2 => "CISCO2821"
"CLEI Code" => "COMV410ARA"
"Product (FRU) Number" => "CISCO2821"
"Part Number" => "73-8853-05"

还有--我希望--一些值得深思的东西。

重要

一个(普通的)模式匹配/查找来自这个match

  • sometimes的input

  • captures/groups/submatches/parentheses
  1. 的一部分,处理这个问题的一般版本会让你以更少的工作获得更多的收益
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9135854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档