Предварительно добавить шаблон регулярного выражения в split и сопоставить класс case с splitted - PullRequest
0 голосов
/ 01 июня 2018

Я хочу разделить следующую строку, которая принимает форму

val str = "X|blnk_1|blnk_2|blnk_3|blnk_4|time1|time2|blnk_5|blnk_6|blnk_7|blnk_8| |Z01|Str1|01|001|NE]|[HEX1|HEX2]|[NA|001:1000|123:456|[00]|]|Z01|Str2|02|002|NE]|[HEX3|HEX4]|[NA|002:1001|234:456|[01]|]|Z02|02|z2|Str|Str|"

Эта строка всегда начинается с X и позиции разделения Z01, Z02, ..., Z0D

str.split("""\|Z0[1|2|3|4|5|6|7|8|9|A|B|C|D]{1}\|""") foreach println

Здесь не может быть упорядочения позиции Z01, ..., Z0D появляются в строке.

Разделение дает желаемый результат:

X|blnk_1|blnk_2|blnk_3|blnk_4|time1|time2|blnk_5|blnk_6|blnk_7|blnk_8|
Str1|01|001|NE]|[HEX1|HEX2]|[NA|001:1000|123:456|[00]|]
Str2|02|002|NE]|[HEX3|HEX4]|[NA|002:1001|234:456|[01]|]
02|z2|Str|Str|

Однако я хочу отобразить X, Z01, ... к классам дел.Поскольку нет упорядочения, нет способа определить, какой класс дел нужно сопоставить (нельзя использовать длину отдельных разбиений).

Я ожидаю, что у моего разделения будет следующий вывод:

X|blnk_1|blnk_2|blnk_3|blnk_4|time1|time2|blnk_5|blnk_6|blnk_7|blnk_8|
Z01|[Str1|01|001|NE]|[HEX1|HEX2]|[NA|001:1000|123:456|[00]|]|
Z01|[Str2|02|002|NE]|[HEX3|HEX4]|[NA|002:1001|234:456|[01]|]|
Z01|02|z2|Str|Str|

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

Например:

case class X( ....)
case class Z01(val1: String, val2: String, val3: String)
case class Z02(val1: Int, val2: String, val3: String,val4:String)
.................

X|blnk_1|blnk_2|blnk_3|blnk_4|time1|time2|blnk_5|blnk_6|blnk_7|blnk_8| отображается на case class X иZ01|[Str1|01|001|NE]|[HEX1|HEX2]|[NA|001:1000|123:456|[00]|]| сопоставляется с классом дел Z01

, и в результате результат должен быть в виде упорядоченных и подобных групп, которые должны быть взяты в качестве массива конкретного класса дел.

X
Array[Z01]
Array[Z02]
......
......

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

В качестве альтернативы это может быть вариант получения значений путем сопоставления их:

(?:Z0[1-9A-D]|^X).*?(?=\|Z0[1-9A-D]|$)

Это соответствует:

  • (?:Z0[1-9A-D]|X\|) В группе без захвата сопоставьте Z0 и перечислите возможные варианты в классе символов или | X в начале ^ строки
  • .*? Соответствует любому символуили более раз без жадности
  • (?=\|Z0[1-9A-D]|$) Положительный прогноз, который утверждает, что ниже следует труба |, за которой следует Z0 и символ из списка символов или | конец строки $

Например:

val re = """(?:Z0[1-9A-D]|^X).*?(?=\|Z0[1-9A-D]|$)""".r
val str = "X|blnk_1|blnk_2|blnk_3|blnk_4|time1|time2|blnk_5|blnk_6|blnk_7|blnk_8| |Z01|Str1|01|001|NE]|[HEX1|HEX2]|[NA|001:1000|123:456|[00]|]|Z01|Str2|02|002|NE]|[HEX3|HEX4]|[NA|002:1001|234:456|[01]|]|Z02|02|z2|Str|Str|"

re.findAllIn(str) foreach println

В результате:

X|blnk_1|blnk_2|blnk_3|blnk_4|time1|time2|blnk_5|blnk_6|blnk_7|blnk_8| 
Z01|Str1|01|001|NE]|[HEX1|HEX2]|[NA|001:1000|123:456|[00]|]
Z01|Str2|02|002|NE]|[HEX3|HEX4]|[NA|002:1001|234:456|[01]|]
Z02|02|z2|Str|Str|

Демо

0 голосов
/ 01 июня 2018

Как насчет этой идеи?

val x = str.split("""\|Z0[1|2|3|4|5|6|7|8|9|A|B|C|D]{1}\|""") // actual string splits
val y = """\|Z0[1|2|3|4|5|6|7|8|9|A|B|C|D]{1}\|""".r.findAllIn(str).toArray // delimiters Array

val final_data = x.slice(1, x.size).zip(y).map(x => x._2+x._1).toList // taking actual splits except first one .... and then zipping and concatenating with delimiters like below. 
/*
    List(|Z01|Str1|01|001|NE]|[HEX1|HEX2]|[NA|001:1000|123:456|[00]|], |Z01|Str2|02|002|NE]|[HEX3|HEX4]|[NA|002:1001|234:456|[01]|], |Z02|02|z2|Str|Str|) */

первые | в final_data могут быть удалены с помощью subString

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...