在Regex和Java中匹配多个

时间:2013-02-19 21:46:10

标签: java regex regex-negation

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

我甚至无法提出符合每个案例的常规快递,所以这可能是一个没有实际意义的点:

这是输入:

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

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

2 个答案:

答案 0 :(得分: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() );
}

我认为你的意思是最后一个匹配。

答案 1 :(得分:1)

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

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

没有'SN'或':'或'思科'

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

然后进一步分解 -

包含''(空格):

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

不 -

CN666SEEEI

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

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