日期:2014-05-20  浏览次数:20836 次

一个关于字符串处理的大难题,搞了一整天没搞出来
有一个文本文档,解析每一行的数据

每一行的数据内容是这样的(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#1
bsfgs
A1
STM-4#1
BSB
I5
STM-4#1
KM-DZH 155_7470:MS_STM1:1-SD2:I7-STM-1#5
KM-DZH 155_7470
MS
STM1:1
SD2
I7
STM-1#5
DZDD:I6-STM-1#1-DZH-KM 155_7470:MS_STM1:1
DZDD
I6
STM-1#1
DZH-KM 155_7470
MS
STM1:1
SD:I6-STM-1#11-4LOU-155M(HUAWEI-wantong):MS_STM1:1
SD
I6
STM-1#11
4LOU-155M(HUAWEI-wantong)
MS
STM1:1 
 
*/