Java 可以在字符串拆分中使用零宽度匹配正则表达式吗?

Java 可以在字符串拆分中使用零宽度匹配正则表达式吗?,java,regex,split,delimiter,Java,Regex,Split,Delimiter,这张打印的是[你好,天哪,再见]。我想把它打印出来。[你好!哦,天哪!!,再见!!]。 `.您可以使用\b(单词边界)作为要查找的内容,因为它是零宽度,并使用它作为查找的锚定 输出: String s = "abc<def>ghi"; String[] bits = s.split("(?<=>)\\b|\\b(?=<)"); for (String bit : bits) { System.out.println(bit); } String s = "He

这张打印的是
[你好,天哪,再见]
。我想把它打印出来。
[你好!哦,天哪!!,再见!!]

`.

您可以使用
\b
(单词边界)作为要查找的内容,因为它是零宽度,并使用它作为查找
的锚定

输出:

String s = "abc<def>ghi";
String[] bits = s.split("(?<=>)\\b|\\b(?=<)");
for (String bit : bits) {
  System.out.println(bit);
}
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!!]
(?=X)X,通过零宽度正向前瞻
(?!X)X,通过零宽度负前瞻

(?多亏了Cine提供的信息,我认为以下是我要寻找的答案:

(?=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
System.out.println(
数组。deepToString(

“abcghi”.split((?=是的副本,我误解了
(?:
是用于。请您对我的答案发表意见,看看是否有什么问题吗?谢谢。您的第二个示例不应该起作用。:/它应该抛出PatternSyntaxException,因为Lookback没有明显的最大长度。您的正则表达式编译是一个bug;它的工作令人难以置信,不值得依赖。下面是内容您应该使用:
(?已经报告了错误,如果这是您的意思的话。我建议您在任何情况下都不要养成在lookbehind中使用可变宽度表达式的习惯;很少有正则表达式风格支持该功能,而且通常还有更好的方法。
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!!]
(?=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
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!!!]