1

我需要考虑一组非常复杂的差异。是编写一个匹配所有这些的正则表达式,还是用 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
  • 思科 1941/k9 锡:FHK13HHHTQ
  • CISCO2121 SN:FHKFFFFEY
  • WS-C2970-24TC-L,序列号:FOCXXXXZ34K
  • WS-C3760-24TS-S,序列号:FDOXXXXX0F6
  • 38 42 42 42 42 42 42 44 42 42

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

4

2 回答 2

2

这适用于给出的示例。

但是,可能需要详细概述“非常复杂的一组差异”,以获得无懈可击的解决方案。

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() );
}

我以为你的意思是最后一个不应该匹配

于 2013-02-19T22:46:03.920 回答
1

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

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

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

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

然后进一步分解 -

包含“”(空格):

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

才不是 -

CN666SEEEI

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

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

于 2013-02-19T21:57:29.610 回答