Java строка разделена с регулярными экспериментами - PullRequest
0 голосов
/ 09 мая 2018

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

"hello_5_9_2018_world" 

to

"hello"
"5_9_2018"
"world"

Я могу разделить его на последнее подчеркивание с помощью

String[] splitArray = subjectString.split("_(?=[^_]*$)");

но я не могу понять, как разбить на первое подчеркивание.

Может ли кто-нибудь показать мне, как я могу это сделать?

Спасибо David

Ответы [ 5 ]

0 голосов
/ 09 мая 2018

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

Вы можете достичь своей цели с помощью этого шаблона:

"([a-zA-Z]+)_(.*)_([a-zA-Z]+)"

Весь код выглядит так:

    String subjectString= "hello_5_9_2018_world";
    Pattern pattern = Pattern.compile("([a-zA-Z]+)_(.*)_([a-zA-Z]+)");
    Matcher matcher = pattern.matcher(subjectString);
    if(matcher.matches()){
        System.out.println(matcher.group(1));
        System.out.println(matcher.group(2));
        System.out.println(matcher.group(3));
    }

Это выводит:

привет

5_9_2018

мир

0 голосов
/ 09 мая 2018

В то время как другие ответы на самом деле лучше и лучше, если вы действительно хотите использовать сплит, вот путь:

"hello_5_9_2018_world".split("((?<=^[^_]*)_)|(_(?=[^_]*$))")

==> String[3] { "hello", "5_9_2018", "world" }

Это комбинация вашей модели прогнозирования (_(?=[^_]*$))
и симметричный паттерн: ((?<=^[^_]*)_)
(соответствует _, которому предшествуют ^ (начало строки) и [^_]* (0..n символов без подчеркивания).

0 голосов
/ 09 мая 2018

Регулярное выражение

(?<first>[^_]+)_(?<middle>.+)+_(?<last>[^_]+)

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

Java Code

final String str = "hello_5_9_2018_world";
Pattern pattern = Pattern.compile("(?<first>[^_]+)_(?<middle>.+)+_(?<last>[^_]+)");
Matcher matcher = pattern.matcher(str);

if(matcher.matches()) {
    String first = matcher.group("first");
    String middle = matcher.group("middle");
    String last = matcher.group("last");
}
0 голосов
/ 09 мая 2018

Если у вас всегда есть три части, как указано выше, вы можете использовать

([^_]*)_(.*)_(^_)*

и получите отдельные элементы в виде групп.

0 голосов
/ 09 мая 2018

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

String s = "hello_5_9_2018_world";

int firstIndex = s.indexOf("_");
int lastIndex = s.lastIndexOf("_");

System.out.println(s.substring(0, firstIndex));
System.out.println(s.substring(firstIndex + 1, lastIndex));
System.out.println(s.substring(lastIndex + 1));

Вышеуказанные отпечатки

hello
5_9_2018
world

Примечание:

Если в строке нет двух _, вы получите StringIndexOutOfBoundsException.

Чтобы защититься от этого, вы можете проверить, действительны ли извлеченные индексы.

  • Если firstIndex == lastIndex == -1, значит, строка не имеют подчеркивания.

  • Если firstIndex == lastIndex, то строка содержит только одно подчеркивание.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...