有一个文本文档,解析每一行的数据
每一行的数据内容是这样的(A,Z表示两个机器):
Adev:Aslot(-/_)Aport-Zdev:Zslot(-/_)Zport
其中Adev是A设备名称,除了字母数字外可能包含减号和下杠两个符号:- 或 _
ASlot是A设备插槽,这是一组字母+数字的字符串,其中不包含任何符号,首位必为字母;
Aport是A设备端口,除了字母数字外可能包含冒号、减号或#,即 : 或 - ,但是,出现-时,减号前肯定是STM或OPS,例如STM1:1、STM-16#1、OPS-3,有时只有一个W
Z设备规则的与A设备相同。
在这些dev,slot,port间有符号相连:
dev和slot的连接符号必为冒号 ":"(没有引号)
slot和port的链接符是减号或下杠: - 或 _
port后面是A和Z的连接符,必为减号 -
由此从数据中解析出adev,aslot,aport,zdev,zslot,zport
给出一些数据的例子:(为了大家看明白我用空格将六个数据隔开)
bsfgs : A1 - STM-4#1 - BSB : I5 - STM-4#1
KM-DZH 155_7470 : MS _ STM1:1 - SD2 : I7 - STM-1#5
DZDD : I6 - STM-1#1 - DZH-KM 155_7470 : MS _ STM1:1
SD : I6 - STM-1#11 - 4LOU-155M(HUAWEI-wantong) : MS _ STM1:1
数据量一般为千行左右,效率可以不用太高
求正则达人啊!
------解决方案--------------------
下面的方法能对付你给出的4行数据,
你的写的“设备名称”说明有错误,
比如你没有说它有空白符,但是的确有空白符:
KM-DZH 155_7470 : MS _ STM1:1 - SD2 : I7 - STM-1#5
再比如你没有说他有括号 但是的确有括号
SD : I6 - STM-1#11 - 4LOU-155M(HUAWEI-wantong) : MS _ STM1:1
至于“设备端口”,你的解释只能用“不伦不类”来形容。
好了贴程序,如果不能处理文件中的其他数据,请把你的样本文件发到275860560@qq.com,OK?
- Java code
import java.io.*;import java.util.regex.*;public class ResolveFile { public static void main(String[] args) { resolveFile("c:/test.txt"); //我把你的测试存入到此文件,并去除空白符,每一条目占一行 } public static void resolveFile(String fileName){ BufferedReader br = null; try { br = new BufferedReader(new FileReader(fileName)); String string; while ((string = br.readLine()) != null) { resolveLine(string);//读取一行,并解释一行 } } catch (IOException e) { throw new RuntimeException(e); } finally { if (br != null) try { br.close(); } catch (IOException e) { throw new RuntimeException(e); } } } public static void resolveLine(String sourceString){ String regex = "^([A-Za-z0-9\\-_()\\s]+?)[:]([A-Za-z][A-Za-z0-9]*?)[\\-_](STM[0-9\\-#:]+?[\\d]+)[\\-]([A-Za-z0-9\\-_()\\s]+?)[:]([A-Za-z][A-Za-z0-9]*?)[\\-_](STM[0-9\\-#:]+?[\\d]+)$"; Matcher matcher = Pattern.compile(regex).matcher(sourceString);// while(matcher.find()){ //将每一行解释出的两个设备相关信息打印出来 System.out.println(matcher.group());//所有信息 System.out.println(matcher.group(1));//设备1名称 System.out.println(matcher.group(2));//设备1插槽 System.out.println(matcher.group(3));//设备1端口 System.out.println(matcher.group(4));//设备2名称 System.out.println(matcher.group(5));//设备2插槽 System.out.println(matcher.group(6));//设备2端口 } } }/*output:bsfgs:A1-STM-4#1-BSB:I5-STM-4#1bsfgsA1STM-4#1BSBI5STM-4#1KM-DZH 155_7470:MS_STM1:1-SD2:I7-STM-1#5KM-DZH 155_7470MSSTM1:1SD2I7STM-1#5DZDD:I6-STM-1#1-DZH-KM 155_7470:MS_STM1:1DZDDI6STM-1#1DZH-KM 155_7470MSSTM1:1SD:I6-STM-1#11-4LOU-155M(HUAWEI-wantong):MS_STM1:1SDI6STM-1#114LOU-155M(HUAWEI-wantong)MSSTM1:1 */