Как разбить строку на основе двух форматов регулярных выражений? - PullRequest
0 голосов
/ 26 января 2019

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

Я пробовал разные комбинации string.split(regex), но безуспешно. Если я использую ([^0-9]+), я могу успешно разделить все нецелые числа вместе в его собственный массив, но целые числа будут потеряны. Если я пытаюсь сделать комбинацию ([^0-9]+)([0-9]+), я получаю странные результаты, а не желаемый результат.

Моей первой попыткой было разбиение строки на символ, поэтому каждый символ, независимо от его типа, является отдельным элементом в массиве string.split(""), но мне нужно сгруппировать числа, чтобы манипулировать, и должен сохранить исходную строку с помощью конец.

С учетом строки:

He1l0oo, th111s is my r@nd0m 86 str1ng

вывод должен быть:

[He], [1], [l], [0], [oo, th], [111], [s is my r@nd], [0], [m ], [86], [ str], [1], [ng]

но я получаю только:

[1], [0], [111], [0], [86], [1]

Мне нужны не целочисленные и целочисленные группы в выводе, чтобы я мог соединить строку обратно в одном формате, и с этим выводом я потерял все остальное. Любая помощь будет оценена!

Ответы [ 2 ]

0 голосов
/ 26 января 2019

Попробуйте использовать регулярное выражение

"(?:\\d+|\\D+)"

Это соответствует группе цифр или цифры не цифры, но не обе.

Грубо говоря, кодбудет выглядеть следующим образом:

Pattern pattern = Pattern.compile("(?:\\d+|\\D+)");
Matcher matcher = pattern.matcher("He1l0oo, th111s is my r@nd0m 86 str1ng");

List<String> groups = new ArrayList<>();
while (matcher.find()) {
    groups.add(matcher.group());
}

System.out.println(groups);
0 голосов
/ 26 января 2019

Проблема в том, что String.split() дает вам только части между разделителями. Сами разделители - подстроки, которые соответствуют шаблону - опущены. Но у вас нет фактических разделителей в вашей строке. Скорее, вы хотите разделить при переходах между цифрами и не цифрами. Они могут быть сопоставлены с помощью утверждений нулевой ширины:

string.split("(?<![0-9])(?=[0-9])|(?<=[0-9])(?![0-9])");

То есть

  • позиция после нецифровой цифры (?<![0-9]) и перед цифрой (?=[0-9])

или (|)

  • позиция после цифры (?<=[0-9]) и перед не цифрой (?![0-9])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...