【问题标题】:Matching multiple in Regex vs Java [closed]在正则表达式与 Java 中匹配多个 [关闭]
【发布时间】:2013-02-19 21:46:09
【问题描述】:

我需要考虑一组非常复杂的差异。是编写一个匹配所有正则表达式还是用 Java 编写单个正则表达式并在 if-then 块中测试每个正则表达式更好?

我什至无法想出匹配每种情况的正则表达式,所以这可能是一个有争议的问题:

这是输入:

  • CN666SEEEI
  • FOC000007HW (2190000002)
  • FHK10AAAAAA (2850000004)
  • JAB031444BA (3108888022)
  • 序列号 JAE14445WW7
  • 序列号:FOC0818S08R 型号:Cisc
  • 序列号:FHK10HHHQ4
  • 型号:CISCO7200VXR,序列号:36555555
  • 思科 CISCO3845 SN:FGL15555532
  • CISCO2831 FHK13XXXX1E
  • CISCO1851 序列号:FHK1XXXX55M
  • CISCO2821 序列号:FHK1333F11J
  • CISCO2921/K9,序列号:FHK1444FF7F
  • Cisco 1941/k9 Sn:FHK13HHHTQ
  • CISCO2121 SN:FHKFFFFFFEY
  • WS-C2970-24TC-L,序列号:FOCXXXXZ34K
  • WS-C3760-24TS-S,序列号:FDOXXXXX0F6
  • 38 42 42 42 42 42 42 44 42 42

现在我需要提取序列号——实际上第一行是最简单的形式,其余的都隐藏在字符串中。最后一个完全无效,应该匹配。

【问题讨论】:

    标签: java regex regex-negation


    【解决方案1】:

    这适用于给出的示例。

    尽管如此,“非常复杂的方差集”可能需要详细概述才能实现无懈可击的解决方案。

    String str = "CN666SEEEI\n" +
        "FOC000007HW (2190000002)\n" +
        "FHK10AAAAAA (2850000004)\n" +
        "JAB031444BA (3108888022)\n" +
        "S/N JAE14445WW7\n" +
        "Serial :FOC0818S08R Model : Cisc\n" +
        "Serial_Number: FHK10HHHQ4\n" +
        "Model:CISCO7200VXR, SN:36555555\n" +
        "Cisco CISCO3845 SN: FGL15555532\n" +
        "CISCO2831 FHK13XXXX1E\n" +
        "CISCO1851 SN: FHK1XXXX55M\n" +
        "CISCO2821 SN: FHK1333F11J\n" +
        "CISCO2921/K9, SN: FHK1444FF7F\n" +
        "Cisco 1941/k9 Sn: FHK13HHHTQ\n" +
        "CISCO2121 SN: FHKFFFFFFEY\n" +
        "WS-C2970-24TC-L, SN: FOCXXXXZ34K\n" +
        "WS-C3760-24TS-S, SN: FDOXXXXX0F6\n" +
        "38 42 42 42 42 42 42 44 42 42";
    
    Matcher m = Pattern.compile( "\\b(?!CISCO)[A-Z\\d]{8,}(?=\\s|$)" ).matcher( str ); 
    
    while ( m.find() ) {
        System.out.println( m.group() );
    }
    

    我假设你的意思是最后一个应该匹配。

    【讨论】:

    • holy #*$# 我认为没有办法编写一个正则表达式来涵盖所有内容。
    【解决方案2】:

    我会将字符串分成不同的组,并根据初始分组对其应用不同的模式。

    第一组可能很简单,例如str.contains(":"),即字符串包含分号。然后进一步分解,下一组是否包含“思科”一词。在您将该列表分解为一些更易于处理的子列表后,如下所示,为每个子列表编写正则表达式会容易得多。

    没有 'SN' 或 ':' 或 'Cisco'

    CN666SEEEI
    FOC000007HW (2190000002)
    FHK10AAAAAA (2850000004)
    JAB031444BA (3108888022)
    

    然后进一步分解-

    包含“”(空格):

    FOC000007HW (2190000002)
    FHK10AAAAAA (2850000004)
    JAB031444BA (3108888022)
    

    没有 -

    CN666SEEEI
    

    这两个组甚至不需要正则表达式,您只需在拆分后提取正确的位即可。

    使用提供的示例来分解您的列表并将简单的正则表达式应用于每个!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-16
      • 1970-01-01
      • 2015-12-01
      • 2014-10-06
      相关资源
      最近更新 更多