Розщеплення Java-рядка символом труби за допомогою розділення ("|")


195

В офіційній документації Java зазначено:

Наприклад, рядок "boo:and:foo"дає наступні результати за допомогою цих виразів Regex Result:

{ "boo", "and", "foo" }"

І саме це мені потрібно для роботи. Однак якщо я запускаю це:

public static void main(String[] args){
        String test = "A|B|C||D";

        String[] result = test.split("|");

        for(String s : result){
            System.out.println(">"+s+"<");
        }
    }

він друкує:

><
>A<
>|<
>B<
>|<
>C<
>|<
>|<
>D<

Що далеко не те, що я очікував:

>A<
>B<
>C<
><
>D<

Чому це відбувається?


Відповіді:


424

Тобі потрібно

test.split("\\|");

splitвикористовує регулярний вираз і в регулярному виразі | є метасимволом , що представляє ORоператора. Вам потрібно уникнути цього символу, використовуючи \(написаний у String, оскільки "\\"так \само є метахарактером у рядках String і вимагати іншого, \щоб уникнути його).

Ви також можете використовувати

test.split(Pattern.quote("|"));

і нехай Pattern.quoteстворить уникнуту версію регексу, що представляє |.


17
Він є, split()метод приймає регулярний вираз і |носить особливий характер для reg ex
Jigar Joshi

1
ти мій другий вибір як модератор переповнення стека. Всього найкращого.
Däñish Shärmà

33

Використовуйте належне втечу: string.split("\\|")

Або в Java 5+ використовуйте помічник Pattern.quote(), створений саме для цієї мети:

string.split(Pattern.quote("|"))

який працює з довільними рядками введення. Дуже корисно, коли вам потрібно процитувати / уникнути введення користувача.


3
Не шукай, коли був здійснений перехід, але в Java 8 можна було б використовувати Pattern.quote().
RAnders00

4

Використовуйте цей код:

public static void main(String[] args) {
    String test = "A|B|C||D";

    String[] result = test.split("\\|");

    for (String s : result) {
        System.out.println(">" + s + "<");
    }
}

На це рішення вже вказується прийнята відповідь. Не потрібно це повторювати.
Пшемо

3

Ви також можете використати бібліотеку apache і зробити це:

StringUtils.split(test, "|");

1

Ви також можете використовувати .split("[|]").

(Я використовував це замість .split("\\|"), що не працювало для мене.)


Обидві версії повинні добре працювати. Якщо хтось цього не робить, це означає, що проблема є деінде.
Пшемо

@Pshemo Це, однак, додає цікавого аромату, що деяких зарезервованих символів не потрібно уникати, якщо їх помістити всередину дужок.
Pax Vobiscum

0
test.split("\\|",999);

Вказання межі або максимуму буде точним для прикладів типу: "boo ||| a" або "|| boo |" або "|||"

Але test.split("\\|");поверне масиви рядків різної довжини для тих же прикладів.

використовувати посилання: посилання


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