你能在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!!!]
现在,第二个是通过试验所有不同的量词来诚实地发现的。 无论是贪婪还是不情愿的工作,都是占有欲的。
我还不确定为什么。