Scala раскол и начало строки в регулярном выражении - PullRequest
0 голосов
/ 01 июня 2018

Я пытаюсь разбить строку на четыре части P, Q, R, S.

Строка начинается с P, как показано в следующем примере:

"P|VAL1|VAL2|VAL3|BLANK|Q|VAL4|BLANK|BLANK|R|VAL5|BLANK|VAL6|HELP|BLANK|VAL7|S|EDIT|BLANK|VAL8|(SDK 1.8)|BLANK".split("[(^?P\\|)][(Q?\\|)]?[(R?\\|)]?[(S?\\|)]")

"P |VAL1 | VAL2 | VAL3 | ПУСТОЙ | Q | VAL4 | ПУСТОЙ | ПУСТОЙ | R | VAL5 | ПУСТОЙ | VAL6 | ПОМОЩЬ | ПУСТОЙ | VAL7 | S | РЕДАКТИРОВАТЬ | ПУСТОЙ | VAL8 | (SDK 1.8) | ПУСТОЙ ».split (" [(^? P \ |)] [(Q? \ |)]? [(R? \ |)]? [(S? \ |)] ") Foreach println

дает

VAL1|VAL2|VAL3|BLANK
VAL4|BLANK|BLANK
VAL5|BLANK|VAL6|HEL
BLANK|VAL7
|EDIT|BLANK|VAL8
DK 1.8
BLANK

, где мои ожидания:

VAL1|VAL2|VAL3|BLANK
VAL4|BLANK|BLANK
VAL5|BLANK|VAL6|HELP|BLANK|VAL7
EDIT|BLANK|VAL8|(SDK 1.8)|BLANK

Однако

"P|VAL1|VAL2|VAL3|BLANK|Q|VAL4|BLANK|BLANK|R|VAL5|BLANK|VAL6|HELP|BLANK|VAL7|S|EDIT|BLANK|VAL8|(SDK 1.8)|BLANK".split("[(^P\\|)][(Q?\\|)]?[(R?\\|)]?[(S?\\|)]") (0)

Проверка первого элемента разделения с помощью выше дает

res9: String = ""

Кажется, что начало строки здесь не соблюдается.Я пробовал это на регулярное выражение 101 , а также он правильно соответствует P |в начале.Однако это также соответствует P| в |HELP|.Так что, похоже, мое регулярное выражение имеет недостатки.Однако мой вопрос: как пустая строка выше играет?

Ответы [ 2 ]

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

Вот один подход, который определяет разделитель как один из P, Q, R, S, заключенный в границу слова \b и необязательный |:

val s = "P|VAL1|VAL2|VAL3|BLANK|Q|VAL4|BLANK|BLANK|R|VAL5|BLANK|VAL6|HELP|BLANK|VAL7|S|EDIT|BLANK|VAL8|(SDK 1.8)|BLANK"

s.split("""\|?\b[PQRS]\b\|?""").filter(_ != "")
// res1: Array[String] = Array(VAL1|VAL2|VAL3|BLANK, VAL4|BLANK|BLANK, VAL5|BLANK|VAL6|HELP|BLANK|VAL7, EDIT|BLANK|VAL8|(SDK 1.8)|BLANK)

Пропустите filter, если вы хотите включить извлеченныйпустые строки.

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

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

\\|[QRS]\\||^P\\|

Вы можете заменить это регулярное выражение на \\|[PQRS]\\||^P\\|, если вы, за исключением других P в качестве разделителя внутристрока

ВЫХОД:

"P|VAL1|VAL2|VAL3|BLANK|Q|VAL4|BLANK|BLANK|R|VAL5|BLANK|VAL6|HELP|BLANK|VAL7|S|EDIT|BLANK|VAL8|(SDK 1.8)|BLANK".split("\\|[QRS]\\||^P\\|");

[, VAL1|VAL2|VAL3|BLANK, VAL4|BLANK|BLANK, VAL5|BLANK|VAL6|HELP|BLANK|VAL7, EDIT|BLANK|VAL8|(SDK 1.8)|BLANK]

В противном случае вам нужно сделать это в 2 шага:

  • сопоставить и удалить P| в начале вашей строки, используя ^P\\| и заменяя ее ничем demo1
  • разбить строку, используя регулярное выражение \\|[QRS]\\| demo2 Вы можете заменить это регулярное выражение на \\|[PQRS]\\|, если вы, за исключением других P, в качестве разделителя внутри строки
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...