【问题标题】:How to split a String with two delimiters and keep only one of of them?如何用两个分隔符拆分字符串并只保留其中一个?
【发布时间】:2020-12-26 13:46:03
【问题描述】:

我想在标点符号和空格中拆分字符串,但保留标点符号。例

String example = "How are you? I am fine!"

我想要结果

["How","are","you","?","I","am","fine","!"]

但我得到了

["how"," ","are"," ","you"," ","?"," ","i"," ","am"," ","fine"," ","!"].

我用的是example.toLowerCase().trim().split("(?<=\\b|[^\\p{L}])");

【问题讨论】:

  • 你为什么要toLowerCase()?这已经弄乱了您的预期结果。为什么trim()?此外,您可以简单地迭代您的结果数组并摆脱 isBlank() 的所有内容。还是您需要通过单个split 调用来完成?
  • @Zabuzard toLowerCase 并不是那么必要,它究竟是如何弄乱结果的?!我试过有没有它,我仍然得到相同的结果!我尝试遍历数组并删除所有未使用的空间,但我仍然没有得到我想要的结果,因此我宁愿在单个拆分调用中完成它或使用 Stringtokenizer

标签: java arrays regex string split


【解决方案1】:

你为什么要toLowerCase()?这已经弄乱了您的预期结果。为什么要在完整字符串上使用trim()

通过单个split 调用来完成此操作可能不太简单。

另一种方法是过滤掉不需要的条目:

String example = "How are you? I am fine!";

Pattern pattern = Pattern.compile("\\b");
String[] result = pattern.splitAsStream(example)
    .filter(Predicate.not(String::isBlank))
    .toArray(String[]::new);

System.out.println(Arrays.toString(result));

输出:

[How, are, you, ? , I, am, fine, !]

回应您想要[How,are,you,?,I,am,fine,!] 作为输出的评论;根本不用Arrays.toString 打印,而是自己手动构建字符串。该数组不包含任何空格。

System.out.println("[" + String.join(",", result) + "]");

【讨论】:

  • 这几乎正是我所需要的。我也只需要去掉输出字符串中字符串中的空格 [How,are,you,?,I,am,fine,!]
  • 然后不要使用Arrays.toString 打印。数组本身不包含任何空格。答案已编辑。
【解决方案2】:

你可以这样做:

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        String example = "How are you? I am fine!";
        String[] arr = example.split("\\s+|\\b(?=\\p{Punct})");
        System.out.println(Arrays.toString(arr));
    }
}

输出:

[How, are, you, ?, I, am, fine, !]

正则表达式的解释:

  1. \\s+ 指定空格
  2. \\b 指定单词边界
  3. (?=\\p{Punct}) 指定标点符号的正向预测。
  4. | 指定交替 (OR)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-27
    • 1970-01-01
    • 2017-03-13
    • 2016-11-26
    相关资源
    最近更新 更多