Можете ли вы использовать регулярное выражение соответствия нулевой ширины в String split? - PullRequest
3 голосов
/ 09 марта 2010
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 ]

3 голосов
/ 09 марта 2010

Вам нужно взглянуть на конструкции соответствия нулевой ширины:

(?=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
1 голос
/ 09 марта 2010

Вы можете использовать \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!!]
0 голосов
/ 09 марта 2010

Благодаря информации от 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!!!]

Теперь, второй был честно обнаружен, экспериментируя со всеми различными квантификаторами. Ни жадная, ни нежелательная работа, но притяжательная работа.

Я до сих пор не знаю, почему.

...