Використовуйте 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 погіршить вашу ефективність. Я рекомендую написати метод, який буде мати характер за символом та розділити рядок, якщо потрібно. Ви можете оптимізувати цю ситуацію, щоб отримати продуктивність журналу (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")), \\ уникнути спеціального .
знаку

або взагалі ви можете використовувати pdfName.split("\\W");як нижче @Peter Knego відповідь
ahmednabil88

1
використовувати [-.]замість-|\\.
Saeed

49

Спробуйте цей регулярний вираз "[-.]+". + Після розглядає послідовні розділові знаки як один. Видаліть плюс, якщо цього не хочете.


8
@Lurkers: Єдина причина , чому Петро не повинні бігти , що -було то , що це перший думати всередині [], в іншому випадку повинні були б бути зворотною косою риси перед ним (і, звичайно, поставити зворотну косу риску перед ним, ми потрібно два, тому що це рядковий буквал).
TJ Crowder

Я думаю, що ця відповідь краща за прийняту, тому що при використанні логічного оператора | проблема полягає в тому, що один з ваших роздільників може бути частиною ваших результатів "жетонів". Цього не відбудеться з [-.] +
Джеком '

26

Ви можете використовувати регулярний вираз "\ W". Це відповідає будь-якому символу, який не має слова. Потрібний рядок:

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

для мене це не працює `String s =" id (INT), ім'я (STRING) ". Використовуючи \\ W тут, створюється масив довжиною 6, де як і має бути лише 4
user3527975

2
Це також порушиться, коли вхід містить символ Unicode. Краще включити лише фактичний роздільник, а не "схопити всіх" \W.
nhahtdh

13

Рядок, який ви надаєте, splitє строковою формою регулярного виразу, так що:

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

Це означає розділити будь-який символ у [](ми повинні втекти -з косою косою рисою, тому що вона особлива всередині []; і, звичайно, нам слід уникнути нахилу, оскільки це рядок). (І навпаки, .зазвичай це особливе, але всередині не особливе [].)


У цьому випадку вам не потрібно уникати дефісу, тому що [-.]його не можна інтерпретувати як діапазон.
Алан Мур

1
@Alan: Оскільки це найперше в класі, це цілком правда. Але я завжди це роблю, занадто легко повернутися пізніше і додати щось перед цим, не замислюючись. Уникнути цього нічого не коштує, тому ...
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);

4

Для двох послідовностей знаків як деліметрів "І" та "АБО" це слід попрацювати. Не забудьте обрізати під час використання.

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

Результат: міст = {"ISTANBUL", "NEW YORK", "PARIS", "TOKYO", "MOSCOW"}


Як я можу отримати вихід на кшталт {"ISTANBUL AND", "NEW YORK AND", "PARIS OR", "TOKYO AND", "MOSCOW"}
Ahamadullah Saikat

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("[.-]");

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 - це безкоштовна послуга з написання коду, доповнивши відповідь, що стосується лише коду, з деякими поясненнями.
Yunnosch

0
s.trim().split("[\\W]+") 

повинен працювати.


2
По-перше, ні, це не працює - можливо, ви можете спробувати його перед публікацією? Тоді ця відповідь така ж, як і ваша, але працює. Нарешті, ви повинні перевірити форматування ( має працювати. )
Arount

1
Будь ласка, допоможіть боротися з нерозумінням того, що StackOverflow - це безкоштовна послуга з написання коду, доповнивши відповідь, що стосується лише коду, з деякими поясненнями.
Yunnosch

-1

Якщо ви знаєте, що жало завжди буде в одному форматі, спочатку розділіть рядок на основі .і збережіть рядок у першому індексі в змінній. Потім розділіть рядок у другому індексі на основі -та зберігайте індекси 0, 1 та 2. Нарешті, розділіть індекс 2 попереднього масиву на основі. і ви повинні були отримати всі відповідні поля.

Зверніться до наступного фрагмента:

String[] tmp = pdfName.split(".");
String val1 = tmp[0];
tmp = tmp[1].split("-");
String val2 = tmp[0];
...

6
Це можна зробити за один крок, тому зробіть це одним кроком. Дивіться інші відповіді.
Кай

2
pdfName.split(".")приводить до масиву нульової довжини.
Алан Мур

1) .Необхідно уникнути як\\.
Шрі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.