3
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!!]。`。

4

3 回答 3

3

您需要查看零宽度匹配结构:

(?=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
于 2010-03-09T04:37:09.187 回答
1

您可以使用\b(word boundary) 作为要查找的内容,因为它是零宽度,并将其用作查找<and的锚点>

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!!]
于 2010-03-09T04:23:52.537 回答
0

感谢 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!!!]

现在,第二个是通过尝试所有不同的量词诚实地发现的。既不贪婪也不勉强工作,但占有欲确实如此。

我仍然不确定为什么。

于 2010-03-09T05:25:25.233 回答