我的问题是在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+|\\.|\\,|\\?|\\!")));
好的,这是交易。为简单起见,我们希望将正则表达式中的上部字符串与正则表达式中的可能多个空格分开。所以,一个 - 这将指向我自己 - 期望看到类似以下内容:
[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]
匹配的点.
字符后跟空格
会破坏上述内容。虽然有一种情况可以匹配它们,当一个跟随另一个或另一种方式时,这只是不起作用,它给出一个长度为1的字符串,它的唯一字符开始一个空格
。
现在我的实际问题是:由于我对正则表达式很恐怖,那么知识比我更好的人能否向我展示一个可以用于这个“复杂”案例的方案,实际上有效吗?
答案 0 :(得分:2)
要匹配1个或多个符号中的1个或多个,您可以使用 character class 并应用+
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+
)且仅单个 .
,,
, ?
或!
。
答案 1 :(得分:1)
由于你在一个点和一个空格上分开,当一个点后跟一个空格时就会出错。在这种情况下,您在结果数组中得到一个空字符串。当然可以预料到:你们两者都分开了,但两者之间什么都没有。
尝试这样的事情:
System.out.println(Arrays.toString(strToSplit.split("[\\s.,?!]+")));
或同等的:
{{1}}