我需要考虑一组非常复杂的差异。编写一个匹配所有它们的正则表达式或者用Java编写单个表达式并用if-then块测试每个表达式是否更好?
我甚至无法提出符合每个案例的常规快递,所以这可能是一个没有实际意义的点:
这是输入:
现在我需要提取序列号 - 实际上第一行是最简单的形式,其余的是隐藏在字符串中。最后一个完全无效,应该匹配。
答案 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
这两个组甚至不需要正则表达式,只需在拆分后提取正确的位。
使用提供的示例来细分列表并将简单的正则表达式应用于每个!