Разбить строку, только если ОБА отрицательный взгляд вперед и отрицательный взгляд позади - PullRequest
2 голосов
/ 14 июня 2019

Здравствуйте, я пришел на этот вопрос , где автор хотел преобразовать строку:

exampleString =  "2 Marine Cargo       14,642 10,528  Denver Factory North     16,016 more text 8,609 argA 2,106 argB"

в массив / список, который выглядит примерно так:

String[] resultArray = {"2", "Marine Cargo", "14,642", "10,528", "Denver Factory North", "16,016",
                "more text", "8,609", "argA", "2,106", "argB"};

Таким образом, числовые части (с запятой или без нее) считаются элементом
и чистые альфа-последовательности (разделенные ни одним, одним или несколькими пробелами) считаются элементом.

Это можно сделать, сопоставив группы
или путем разделения на пробелы, где как предыдущая, так и следующая часть строки не имеют альфа-последовательности. Мне любопытно, возможно ли последнее. Я думаю, что часть должна быть сделана с отрицательным взглядом вперед:

\s+(?![A-Za-z]+)

и часть с отрицательным взглядом позади.

(?<![a-zA-Z])\s+

Я хочу объединить оба утверждения таким образом, чтобы оно совпадало только с , а не , если обе части до и после последовательности пробелов являются альфа-значениями, поэтому можно объединять несколько слов в цепочку, не разбивая их между. Я нашел еще один вопрос по этой теме, но я не смог перепроектировать его для этого конкретного случая. Это возможно?

1 Ответ

5 голосов
/ 14 июня 2019

Вы можете использовать

String[] results = exampleString.split("(?<=\\d)\\s+(?=[a-zA-Z])|(?<=[a-zA-Z])\\s+(?=\\d)|(?<=\\d)\\s+(?=\\d)");

См. Демоверсию regex

Детали

  • (?<=\d)\s+(?=[a-zA-Z]) - 1+ пробелов, которые имеют цифру слева и букву справа
  • | - или
  • (?<=[a-zA-Z])\s+(?=\d) - 1+ пробелов, которые имеют букву слева и цифру справа
  • | - или
  • (?<=\d)\s+(?=\d) - 1+ пробелов, которые имеют цифру слева и цифру справа.

Демонстрация Java :

String exampleString =  "2 Marine Cargo       14,642 10,528  Denver Factory North     16,016 more text 8,609 argA 2,106 argB";
String results[] = exampleString.split("(?<=\\d)\\s+(?=[a-zA-Z])|(?<=[a-zA-Z])\\s+(?=\\d)|(?<=\\d)\\s+(?=\\d)");
for (String s: results) {
    System.out.println(s);
}

Выход:

2
Marine Cargo
14,642
10,528
Denver Factory North
16,016
more text
8,609
argA
2,106
argB
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...