Можете ли вы использовать регулярное выражение соответствия нулевой ширины в String split?
System.out.println(
Arrays.deepToString(
"abc<def>ghi".split("(?:<)|(?:>)")
)
);
Это печатает [abc, def, ghi]
как будто я разделился на "<|>"
, Я хочу это напечатать [abc, <def>, ghi]
, Есть ли способ использовать магию регулярных выражений для достижения того, чего я хочу здесь?
Возможно, более простой пример:
System.out.println(
Arrays.deepToString(
"Hello! Oh my!! Good bye!!".split("(?:!+)")
)
);
Это печатает [Hello, Oh my, Good bye]
, Я хочу это напечатать [Hello!, Oh my!!, Good bye!!]
, `.
3 ответа
Благодаря информации от Cine, я думаю, что это ответы, которые я ищу:
System.out.println(
Arrays.deepToString(
"abc<def>ghi<x><x>".split("(?=<)|(?<=>)")
)
); // [abc, <def>, ghi, <x>, <x>]
System.out.println(
Arrays.deepToString(
"Hello! Oh my!! Good bye!! IT WORKS!!!".split("(?<=!++)")
)
); // [Hello!, Oh my!!, Good bye!!, IT WORKS!!!]
Теперь, второй был честно обнаружен, экспериментируя со всеми различными квантификаторами. Ни жадная, ни неохотная работа, но притяжательная работа.
Я до сих пор не уверен, почему.
Вы должны взглянуть на конструкции соответствия нулевой ширины:
(?=X) X, via zero-width positive lookahead
(?!X) X, via zero-width negative lookahead
(?<=X) X, via zero-width positive lookbehind
(?<!X) X, via zero-width negative lookbehind
Ты можешь использовать \b
(граница слова) как то, что нужно искать, так как оно имеет нулевую ширину и использовать это в качестве якоря для поиска <
а также >
,
String s = "abc<def>ghi";
String[] bits = s.split("(?<=>)\\b|\\b(?=<)");
for (String bit : bits) {
System.out.println(bit);
}
Выход:
abc
<def>
ghi
Теперь это не общее решение. Для этого вам, вероятно, потребуется написать собственный метод разбиения.
Ваш второй пример показывает, что это не совсем split()
вы после, но цикл соответствия регулярных выражений. Например:
String s = "Hello! Oh my!! Good bye!!";
Pattern p = Pattern.compile("(.*?!+)\\s*");
Matcher m = p.matcher(s);
while (m.find()) {
System.out.println("[" + m.group(1) + "]");
}
Выход:
[Hello!]
[Oh my!!]
[Good bye!!]