Используйте String.split () с несколькими разделителями

201

Мне нужно разделить строку строки на разделитель -и .. Ниже приведены мои желаемые результаты.

AA.BB-CC-DD.zip ->

AA
BB
CC
DD
zip 

но мой следующий код не работает.

private void getId(String pdfName){
    String[]tokens = pdfName.split("-\\.");
}
Тханг Фам
источник
Судя по тому, что вы сказали, похоже, все работает нормально. Какой ваш желаемый результат?
Джефф
2
@Jeff: Он показал желаемый результат ( AA/ BB/ CC...)
TJ Crowder
2
Ты уверен? Я интерпретировал это как его текущий результат, а не его желаемый результат. Может быть, пришло время встать и погулять немного.
Джефф
@Jeff: Извините за путаницу, я обновил свой пост, чтобы убрать ваше неправильное понимание.
Тханг Фам
Regex ухудшит вашу производительность. Я бы рекомендовал написать метод, который будет идти символ за символом и разбивать строку, если это необходимо. Вы можете оптимизировать это далее, чтобы получить log (n) производительность.
князь

Ответы:

311

Я думаю, что вам нужно включить оператор регулярного выражения ИЛИ :

String[]tokens = pdfName.split("-|\\.");

То, что у вас есть, будет соответствовать:
[DASH, а затем DOT вместе], а -.
не
[DASH или DOT любой из них] -или.

Ричард Х
источник
9
почему нам нужны две обратные косые черты ??
pjain
7
Символ .в регулярном выражении означает любой символ, кроме новой строки. tutorialspoint.com/java/java_regular_expressions.htm В этом случае, однако, они хотели фактический символ .. Две обратные косые черты указывают, что вы имеете в виду .. Обратная косая черта является побегом.
Monkeygrinder
2
для нормальных случаев .split("match1|match2")(например, split("https|http")) \\ нужно избегать специального символа .в указанном выше случае
praagagupd
или вообще, вы можете использовать, pdfName.split("\\W");как показано ниже @Peter Knego answer
ahmednabil88
1
использовать [-.]вместо-|\\.
Saeed
49

Попробуйте это регулярное выражение "[-.]+". Знак + обрабатывает последовательные символы-разделители как единое целое. Удалить плюс, если вы этого не хотите.

Питер Кнего
источник
8
@Lurkers: Единственная причина, по которой Питеру не пришлось бежать, -заключалась в том, что это первая мысль внутри [], иначе перед ней должен был стоять обратный слеш (и, конечно, перед ним стоит обратный слеш, мы нужно два, потому что это строковый литерал).
TJ Crowder
Я думаю, что этот ответ лучше, чем принятый, потому что, когда вы используете логический оператор |, проблема заключается в том, что один из ваших разделителей может быть частью вашего результата «токены». Этого не случится с Питером Кнего [-.] +
Джеком
26

Вы можете использовать регулярное выражение "\ W". Это соответствует любому не-словесному символу. Необходимая строка будет:

String[] tokens=pdfName.split("\\W");
Варун Гангал
источник
это не работает для меня `String s =" id (INT), name (STRING), ". Использование \\ W здесь создает массив длины 6, где должно быть только 4
user3527975
2
Это также прервется, если ввод содержит символ Unicode. Лучше включать только фактический разделитель, а не «захватить все» с \W.
nhahtdh
13

Заданная вами строка splitявляется формой регулярного выражения, поэтому:

private void getId(String pdfName){
    String[]tokens = pdfName.split("[\\-.]");
}

Это означает разделение на любой символ в [](мы должны избежать -обратной косой черты, потому что она особенная внутри []; и, конечно, мы должны избежать обратной косой черты, потому что это строка). (И наоборот, .обычно особенный, но не особенный внутри [].)

TJ Crowder
источник
В этом случае вам не нужно экранировать дефис, потому что [-.]он не может быть интерпретирован как диапазон.
Алан Мур
1
@ Алан: Потому что это самая первая вещь в классе, это правда. Но я всегда так делаю, слишком легко вернуться позже и добавить что-то перед этим, не задумываясь. Сбежать это ничего не стоит, так что ...
TJ Crowder
ты знаешь как избежать скобок? У меня есть строка «[200] Engineering», которую я хочу разделить на «200», «Engineering»
scottysseus
3
Ого, я понял ... Мне пришлось использовать две обратные косые черты вместо одной. String[] strings = codes.get(x).split("\\[|\\]| ");<- код для всех, кто интересуется
scottysseus
13

Используя Guava, вы можете сделать это:

Iterable<String> tokens = Splitter.on(CharMatcher.anyOf("-.")).split(pdfName);
ColinD
источник
4

Для двух последовательностей символов в качестве разделителей «И» и «ИЛИ» это должно работать. Не забудьте обрезать во время использования.

 String text ="ISTANBUL AND NEW YORK AND PARIS OR TOKYO AND MOSCOW";
 String[] cities = text.split("AND|OR"); 

Результат: города = {"СТАМБУЛ", "НЬЮ-ЙОРК", "ПАРИЖ", "ТОКИО", "МОСКВА"}

ÖMER TAŞCI
источник
Как я могу получить выходные данные, такие как {"СТАМБУЛ И", "НЬЮ-ЙОРК И", "ПАРИЖ ИЛИ", "ТОКИО И", "МОСКВА"}
Ахамадулла Сайкат
3

Я бы использовал Apache Commons:

Импортировать org.apache.commons.lang3.StringUtils;

private void getId(String pdfName){
    String[] tokens = StringUtils.split(pdfName, "-.");
}

Он будет разделен на любой из указанных разделителей, в отличие от StringUtils.splitByWholeSeparator(str, separator)которого в качестве разделителя используется полная строка

Эдд
источник
3
String[] token=s.split("[.-]");
Nitish
источник
9
Пожалуйста, помогите бороться с неправильным пониманием того, что StackOverflow является бесплатной службой написания кода, дополнив ваш ответ только кодом с некоторыми пояснениями.
Yunnosch
2

Лучше использовать что-то вроде этого:

s.split("[\\s\\-\\.\\'\\?\\,\\_\\@]+");

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

Притам Банерджи
источник
1

Вы также можете указать регулярное выражение в качестве аргумента в методе split () .. см. Пример ниже ....

private void getId(String pdfName){
String[]tokens = pdfName.split("-|\\.");
}
Авдеш Ядав
источник
1

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

var string = 'AA.BB-CC-DD.zip';
array = string.split(/[,.]/);
жатка
источник
1
Пожалуйста, помогите бороться с неправильным пониманием того, что StackOverflow является бесплатной службой написания кода, дополнив ваш ответ только кодом с некоторыми пояснениями.
Юннош
0
s.trim().split("[\\W]+") 

должно сработать.

SSS
источник
2
Во-первых, нет, это не работает - может быть, вы можете попробовать это перед публикацией? Тогда этот ответ такой же, как ваш - но работает. Наконец, вы должны проверить свое форматирование ( должно работать. ).
Arount
1
Пожалуйста, помогите бороться с неправильным пониманием того, что StackOverflow является бесплатной службой написания кода, дополнив ваш ответ только кодом с некоторыми пояснениями.
Юннош
-1

Если вы знаете, что строка всегда будет в одном и том же формате, сначала разбейте строку на основе .и сохраните строку с первым индексом в переменной. Затем разделите строку во втором индексе на основе -и сохраните индексы 0, 1 и 2. Наконец, разделите индекс 2 предыдущего массива на основе, .и вы должны были получить все соответствующие поля.

Обратитесь к следующему фрагменту:

String[] tmp = pdfName.split(".");
String val1 = tmp[0];
tmp = tmp[1].split("-");
String val2 = tmp[0];
...
isometrik
источник
6
Это можно сделать за один шаг, поэтому сделайте это за один шаг. Смотрите другие ответы.
Кай
2
pdfName.split(".")приводит к массиву нулевой длины.
Алан Мур
1) .Нужно сбежать как\\.
Шри