你能在String split中使用零宽度匹配正则表达式吗?

System.out.println( Arrays.deepToString( "abcghi".split("(?:)") ) ); 

这打印[abc, def, ghi] ,好像我已经拆分"" 。 我希望它打印[abc, , ghi] 。 有没有办法使用一些正则表达式魔法来完成我想要的东西?


也许是一个更简单的例子:

 System.out.println( Arrays.deepToString( "Hello! Oh my!! Good bye!!".split("(?:!+)") ) ); 

这打印[Hello, Oh my, Good bye] 。 我想要它打印[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 (? 

您可以使用\b (单词边界)作为查找内容,因为它是零宽度并将其用作寻找<>的锚点。

 String s = "abcghi"; String[] bits = s.split("(?<=>)\\b|\\b(?=<)"); for (String bit : bits) { System.out.println(bit); } 

输出:

 abc  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!!] 

感谢来自Cine的信息,我认为这些是我正在寻找的答案:

 System.out.println( Arrays.deepToString( "abcghi".split("(?=<)|(?<=>)") ) ); // [abc, , ghi, , ] System.out.println( Arrays.deepToString( "Hello! Oh my!! Good bye!! IT WORKS!!!".split("(?<=!++)") ) ); // [Hello!, Oh my!!, Good bye!!, IT WORKS!!!] 

现在,第二个是通过试验所有不同的量词来诚实地发现的。 无论是贪婪还是不情愿的工作,都是占有欲的。

我还不确定为什么。