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.,?!]+")));
输出:
[Hello, deer, Nice, to, meet, you, How, are, you, today, Don't, you, go, missing, on, me, okay]
要点是 "\s+|\.|\,|\?|\!"
只匹配 1 个或多个空格(\s+
)并且只匹配 单个 .
, ,
、?
或 !
.
我的问题是关于在 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.,?!]+")));
输出:
[Hello, deer, Nice, to, meet, you, How, are, you, today, Don't, you, go, missing, on, me, okay]
要点是 "\s+|\.|\,|\?|\!"
只匹配 1 个或多个空格(\s+
)并且只匹配 单个 .
, ,
、?
或 !
.