2017-01-19 1 views
1

Что может быть регулярным выражением для стандартного протокола стандарта ASTM?Регулярные выражения для строки протокола ASTM

"P|1||123456||^|||U" + ProtocolASCII.LF 
    + "O|1||138||||||||||||O" + ProtocolASCII.LF 
    + "R|1|^^^BE(B)||mmol/L||C||||||20150819144937" + ProtocolASCII.LF 
    + "R|2|^^^BEecf||mmol/L||C" + ProtocolASCII.LF 
    + "R|3|^^^Ca++|1.17|mmol/L" + ProtocolASCII.LF 

Где ProtocolASCII.LF = '\n'. Я пишу String парсер для извлечения данных из этой строки.

Я разделил строку на основе \n, и теперь мне нужно проанализировать каждую строку, чтобы извлечь данные.

Есть ли регулярное выражение, чтобы я мог отображать и получать желаемый результат?

Строки P|1||123456||^|||U" + ProtocolASCII.LF присутствует пациент, где число Р означает тег пациента или информацию о пациенте и является номером пациента.

Для строки R|3|^^^Ca++|1.17|mmol/L" + ProtocolASCII.LF является результатом проведенного лабораторного испытания. Где R указано результат, ^^^ Ca ++ указывает имя результата, 1.17 это значение результата и ммоль/л представляет собой единицу.

В настоящее время я разборе строки, как:

String[] resultArray = dataString.split("[\\r\\n]+"); 

    HashMap<String, Object> resultData = new HashMap<>(); 
    List<Result> sampleResults = new ArrayList<>(); 

    for (String res : resultArray) { 
     //Get first character of String 
     char startChar = res.charAt(0); 
     switch (startChar) { 
      case ProtocolASCII.STX: 
       //Handle Header information. This is special case 
       if (res.charAt(2) == ProtocolASCII.Alphabet.H 
         || res.charAt(1) == ProtocolASCII.Alphabet.H) { 
        resultData.put(Key.MACHINE_INFO, getHeaderInfo(res)); 
        //System.out.println(res.charAt(2));   
       } 
       break; 
      case ProtocolASCII.Alphabet.P: 
       resultData.put(Key.PATIENT, getPatientInfo(res)); 
       break; 
      case ProtocolASCII.Alphabet.O: 
       resultData.put(Key.ORDER, getOrderInfo(res)); 
       break; 
      case ProtocolASCII.Alphabet.R: 
       sampleResults.add(getResultInfo(res)); 
       break; 
      case ProtocolASCII.Alphabet.L: 
       // TODO - Handle end of line 
       break; 
     } 
    } 

Это мой полный ASTM протокол Строка:

/** 
* Sample string 
*/ 
public static final String MACHINE_STRING_ASTM = ProtocolASCII.STX + "1H|\\^&|||GEM 3000^5.6.1  ^21152^^023665^2.4|||||||||20150819154754" + ProtocolASCII.LF 
     + "P|1||322061||^|||U" + ProtocolASCII.LF 
     + "O|1||138||||||||||||O" + ProtocolASCII.LF 
     + "R|1|^^^BE(B)||mmol/L||C||||||20150819144937" + ProtocolASCII.LF 
     + "R|2|^^^BEecf||mmol/L||C" + ProtocolASCII.LF 
     + "R|3|^^^Ca++|1.17|mmol/L" + ProtocolASCII.LF 
     + "R|4|^^^Ca++(7.4)||mmol/L||C" + ProtocolASCII.LF 
     + "R|5|^^^HCO23-||mmol/L||C" + ProtocolASCII.LF 
     + "R|6|^^^HCO3std||mmol/L||C" + ProtocolASCII.LF 
     + "R|7|^^^K+|5.0|mmol/L" + ProtocolASCII.LF 
     + "R|8|^^^Na+|140|mmol/L" + ProtocolASCII.LF 
     + "R|9|^^^SO2c||%||C" + ProtocolASCII.LF 
     + "R|10|^^^TCO2||mmol/L||C" + ProtocolASCII.LF 
     + "R|11|^^^THbc||g/dL||C" + ProtocolASCII.LF 
     + "R|12|^^^Temp|37.0|C" + ProtocolASCII.LF 
     + "L|1" + ProtocolASCII.EOT; 

Есть ли способ, что я могу извлечь данные с помощью Regular Expressions?

Дайте мне знать, если требуется дополнительная информация.

Благодаря

+0

Дайте нам четкую картину, что вы хотите получить от строк, когда она начинается с P, R, O, L соответственно ... тогда, возможно, не нужно понимать протокол ASTM, но дать вам решение ... скажем, , если строка начинается с P, что вы хотите проанализировать для остальной части строки, а также для R, O, L –

+0

@Maverick_Mrt Я также упомянул об этом! Если он начинается с ** R **, нам нужно получить значения, кроме ** | **, потому что это разделитель. Пример: R | 3 | является результатом испытаний химического компонента ** Ca ++ **, имеющего значение ** 1,17 ** с единицей ** ммоль/л **. Итак, всякий раз, когда R | n | приходит, мне нужно, чтобы эти данные были извлечены. Заметим, что R | 4 | имеет все эти вещи, кроме ценности. –

ответ

1

Вы можете попробовать это для R и P:

(?:^(R)\|(\d+)\|\^*([^|]*)\|([^|]*)\|(?:([^|]*)\|)?.*$)|(?:^(P)\|(\d+)\|\|(\d+).*$) 

Explanation

Попробуйте это:

final String regex = "(?:^(R)\\|(\\d+)\\|\\^*([^|]*)\\|([^|]*)\\|(?:([^|]*)\\|)?.*$)|(?:^(P)\\|(\\d+)\\|\\|(\\d+).*$)"; 
final String string = "P|1||322061||^|||U \n" 
    + "O|1||138||||||||||||O \n" 
    + "R|1|^^^BE(B)||mmol/L||C||||||20150819144937 \n" 
    + "R|2|^^^BEecf||mmol/L||C \n" 
    + "R|3|^^^Ca++|1.17|mmol/L \n" 
    + "R|4|^^^Ca++(7.4)||mmol/L||C \n" 
    + "R|5|^^^HCO23-||mmol/L||C \n" 
    + "R|6|^^^HCO3std||mmol/L||C \n" 
    + "R|7|^^^K+|5.0|mmol/L \n" 
    + "R|8|^^^Na+|140|mmol/L \n" 
    + "R|9|^^^SO2c||%||C \n" 
    + "R|10|^^^TCO2||mmol/L||C \n" 
    + "R|11|^^^THbc||g/dL||C \n" 
    + "R|12|^^^Temp|37.0|C\n"; 

final Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE | Pattern.MULTILINE); 
final Matcher matcher = pattern.matcher(string); 

while (matcher.find()) { 
    //System.out.println("Full match: " + matcher.group(0)); 

    if(matcher.group(1)!=null && matcher.group(1).equalsIgnoreCase("R")) 
    { 
     System.out.println("Result NO:"+matcher.group(2)); 
     System.out.println("Component:"+matcher.group(3)); 
     System.out.println("value:"+matcher.group(4)); 
     System.out.println("unit:"+matcher.group(5)); 

     System.out.println("##############################"); 
    } 
    else if(matcher.group(6)!=null && matcher.group(6).equalsIgnoreCase("P")) 
    { 
     System.out.println("Patient :"+matcher.group(7)); 
     System.out.println("Patient Number:"+matcher.group(8)); 

     System.out.println("##############################"); 
    } 
} 

Пример вывода:

Patient :1 
Patient Number:322061 
############################## 
Result NO:1 
Component:BE(B) 
value: 
unit:mmol/L 
############################## 
Result NO:2 
Component:BEecf 
value: 
unit:mmol/L 
############################## 
Result NO:3 
Component:Ca++ 
value:1.17 
unit:mmol/L 
R 
############################## 
Result NO:5 
Component:HCO23- 
value: 
unit:mmol/L 
############################## 
Result NO:6 
Component:HCO3std 
value: 
unit:mmol/L 
############################## 
Result NO:7 
Component:K+ 
value:5.0 
unit:mmol/L 
R 
############################## 
Result NO:9 
Component:SO2c 
value: 
unit:% 
############################## 
Result NO:10 
Component:TCO2 
value: 
unit:mmol/L 
############################## 
Result NO:11 
Component:THbc 
value: 
unit:g/dL 
############################## 
Result NO:12 
Component:Temp 
value:37.0 
unit:null 
############################## 
+0

Вау! Это просто потрясающе. Я боролся пару дней. Просто небольшое изменение. Как видите, некоторые из компонентов имеют символ caps (^), это необязательно, или это может произойти или нет в строке. Можете ли вы изменить регулярное выражение, чтобы принять компонент, например ^^^ Ca ++, и без символов cap, т. Е. Ca ++? –

+0

Да, это может быть часть String или нет, но если это происходит, оно должно быть с компонентом, например ^^^ K + –

+0

Ok,^является необязательным, попробуйте сейчас –

Смежные вопросы