【问题标题】:Spliting string in word boundaries requires '+'在单词边界中拆分字符串需要 '+'
【发布时间】:2021-05-18 21:07:36
【问题描述】:

我想在单词边界中分割一个字符串,因此现在我正在考虑那个空格,一个','和一个'。'或者 '!'表示单词的边界。
在以下示例中:

String text = "This is, just a text to be used, for testing purpose. Nothing more!";
String[] words = text.split("[\\s+,.!]");
for(String w: words) {
    System.out.println(w);
}  

打印出来:

This
is

just
a
text
to
be
used

for
testing
purpose

Nothing
more

如您所见,以,.! 结尾的词有空词
但是如果我在我的正则表达式中添加一个+

String[] words = text.split("[\\s+,.!]+");
for(String w: words) {
    System.out.println(w);
}  
This
is
just
a
text
to
be
used
for
testing
purpose
Nothing
more

空话不存在。为什么需要+ 才能避免空话?

【问题讨论】:

    标签: java regex string split


    【解决方案1】:

    "[\\s+,.!]" 不会做你认为的那样。在[]s 内部,+ 被视为文字字符,而不是表示“一个或多个”的正则表达式特殊字符。

    第一个模式中的空字符串是因为像", " 这样的子字符串在","" " 之间有一个空字符串。

    "[\\s+,.!]+" 起作用是因为正则表达式重复字符+ 位于正确的位置——“前一组中的一个或多个字符”,即在最后一个+ 之前的[] 中的内容.

    但组内的+ 可能不是您想要的。这会将"foo+bar" 拆分为{"foo", "bar"},这似乎是误报。使用"[\\s,.!]+" 来缓解这种情况。

    【讨论】:

    • 如果我不能在括号内使用\\s+,我怎么能在多个空格上包含拆分呢?
    • "[\\s,.!]+" 这样做。例如,它将" "" .. . . . ""!!,." 等视为单个分隔符。 "foo ... !!, ,, . ,, bar" => {"foo", "bar"}.
    猜你喜欢
    • 2021-09-07
    • 1970-01-01
    • 2016-03-24
    • 2022-12-07
    • 1970-01-01
    • 2014-11-09
    • 1970-01-01
    相关资源
    最近更新 更多