我知道这是一个老问题,但为了未来观众的利益:您正在寻找的概念是“捕获组”。捕获组允许您引用表达式中的匹配项并在以后检索它们,例如通过反向引用,而不是吞下字符串。
从文档中,您需要了解以下相关语法:
(?<name>X) X, as a named-capturing group
(?:X) X, as a non-capturing group
(?idmsuxU-idmsuxU) Nothing, but turns match flags i d m s u x U on - off
(?idmsux-idmsux:X) X, as a non-capturing group with the given flags i d m s u x on - off
(?=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
(?>X) X, as an independent, non-capturing group
使用输入文本:
String example = "ABC DEF GHI J K";
您可以使用正负前瞻组合将尾随空格与每个单词组合起来:
// Result: [ABC , DEF , GHI , J , K]
example.split("(?<=\\s+)(?!\\s)");
或者您可以使用正向前瞻来捕获单词边界,以将空格保留为单独的分组元素:
// Result: [ABC, , DEF, , GHI, , J, , K]
example.split("(?=\\b)");
Java 模式 API:
http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html
旁注:虽然“用完全不可信的东西替换文本”的建议很诱人,因为它很容易,但不要 曾经在生产代码中这样做。它会最终失败,而且它发生的频率比你想象的要多。在一名程序员使用了大约 80 列“~=$~=$~=$...”并认为这是安全的之后,我调试了一个呼叫中心。这持续了几个月,直到一位服务代表用这个序列在他的笔记上保存了一个“花哨的边界”。我什至在搜索服务器上目睹了真正的随机 MD5 冲突。诚然,MD5 碰撞花了 11 年时间,但它仍然使搜索崩溃,重点仍然存在。 唯一的字符串永远不会。始终假设会出现重复项。