Можете ли вы использовать регулярное выражение с нулевой шириной в 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!!]
.
`.
Ответы
Ответ 1
Благодаря информации от 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!!!]
Теперь второй был честно обнаружен, экспериментируя со всеми различными кванторами. Ни жадная, ни неохотная работа, но притяжательная.
Я все еще не уверен, почему.
Ответ 2
Вам нужно взглянуть на конструкции с нулевой шириной соответствия:
(?=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
Ответ 3
Вы можете использовать \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!!]