java 中的另一个字符串拆分

Yet another string splitting in java

我的问题是关于在 Java 应用程序中使用多个定界符拆分字符串。

我知道您可以使用不太花哨的 StringTokenizer 进行拆分,也可以使用首选的拆分方法。我尝试使用它:

String strToSplit = "Hello deer. Nice to meet you!How are you today? Don't you go missing on me, okay?";
System.out.println(Arrays.toString(strToSplit.split("\s+|\.|\,|\?|\!")));

好的,这就是交易。为简单起见,我们希望沿着正则表达式中那些漂亮的分隔符拆分上面的字符串,并可能有多个 space。所以,一个 - 指向我自己 - 会期望看到如下内容:

[Hello, deer, Nice, to, meet, you, How, are, you, today, Don't, you, go, missing, on, me, okay]

实际上这就是我直接问 !!!NOT!!! 将问题标记为重复的确切原因,因为这是所有其他问题的确切解决方案存在于此。好吧,虽然它在某些情况下确实有效,但在大写情况下却不行……是的,我知道这很糟糕。一个公认的解决方案,比如 100 多次,但它是有缺陷的。因为当多个定界符彼此跟随时,此解决方案会流血。所以上面提到的 - 让我重复一遍 100+ 接受的解决方案 - 五是不正确的输出:

[Hello, deer, , Nice, to, meet, you, How, are, you, today, , Don't, you, go, missing, on, me, , okay]

匹配的点 . 字符后跟 space 打破了上述。虽然有一种情况可以匹配它们,当一个跟随另一个或其他方式时,这只是行不通,它给出一个长度为 1 的字符串,并且它的唯一字符以 space 开头。

现在回答我的实际问题:由于我不擅长正则表达式,有没有比我知识渊博的人能告诉我一个可以用于这个 "complicated" 案例并且实际有效的方案?

由于您在一个点和一个 space 上拆分,所以当一个点后面跟着一个 space 时,事情就会出错。在这种情况下,您会在结果数组中得到一个空字符串。这当然是意料之中的:你在两者上都分裂了,但两者之间没有任何关系。

尝试这样的事情:

System.out.println(Arrays.toString(strToSplit.split("(\s+|\.|\,|\?|\!)+")));

或等价物:

System.out.println(Arrays.toString(strToSplit.split("[\s.,?!]+")));

要一次匹配1个或多个符号,您可以使用character class and apply + quantifier使其匹配1个或多个字符。

String strToSplit = "Hello deer. Nice to meet you!How are you today? Don't you go missing on me, okay?";
System.out.println(Arrays.toString(strToSplit.split("[\s.,?!]+")));

IDEONE demo

输出:

[Hello, deer, Nice, to, meet, you, How, are, you, today, Don't, you, go, missing, on, me, okay]

要点是 "\s+|\.|\,|\?|\!" 只匹配 1 个或多个空格(\s+)并且只匹配 单个 ., ,?!.