【问题标题】:Split a text without whitespaces by words in list按列表中的单词拆分没有空格的文本
【发布时间】:2019-02-07 11:19:38
【问题描述】:

我有三个列表,我已经合并到一个列表中

    static List allLists = Stream.of(list1, list2, list3)
        .flatMap(Collection::stream)
        .collect(Collectors.toList());

我有没有空格的用户输入

String = "HelloIwanttobookanonlineseminaratyourcompany"

用户输入String 中的所有单词都已经在allLists 中。我想遍历allLists 并在字符串中插入空格,找到每个单词。结果应该是:

String = "Hello I want to book an online seminar at your company"

我想念一个简单的解决方案吗?

【问题讨论】:

  • 没有简单的解决方案,因为也许我想预订在线研讨会。换句话说:有多种方法可以用相同的单词列表标记相同的字符串。
  • 但是如果“an”和“online”在我的列表中,而“anon”不在,它应该只扫描我列表中的单词。
  • 再一次,可以有“He”这个词“Hello”这个词。您的示例所需的输出是什么?
  • 在这种情况下,allLists 中只会有“hello”这个词,而不是“he”这个词
  • 好的。也许我不是很清楚。我的问题是:如果您的allList 中有“he”、“hello”“llo”怎么办? (如果我们可以假设“llo”是可接受的词)。

标签: java string list split java-stream


【解决方案1】:

使用由allLists 构建的(大量)look behind 以在每个单词前插入空格的单行代码:

str = str.replaceAll("(?<=" + String.join("|", allLists) + ")", " ");

注意allLists 中的单词顺序很重要;如果您希望优先使用较长的单词,请先列出它们(推荐)。例如,如果“book”和“booking”都在您的列表中,请将 booking 放在 book 之前,否则您的结果中会出现“booking”。

【讨论】:

  • 请帮我理解你的答案(b/c 我讨厌正则表达式)。如果我有 book、booking、boo、king,allList 中的单词顺序应该是什么?
  • 非常感谢!我会试试这个
  • 按照间距的优先顺序列出单词 - 第一个命中将在其后得到一个空格。此解决方案“简单”,但可能对您不起作用,因为如果它无法通过字符串找到路径以使结果仅是间隔的已知单词,则它不会回溯。
  • @colin 我稍微改变了它以使用向后看而不是向前看
  • 没关系,"book""booking"出现在列表中的顺序。向后看时总是会检测到"book" "booking",因为它们出现在不同的文本位置。显然,在这两种情况下,您可以在使用前瞻时构建类似的有问题的示例,更不用说可以在另一个单词中间找到的单词了。错误始于使用零宽度模式的决定,而不是仅仅使用单词。当您使用str.replaceAll(String.join("|", allLists), "$0 ") 并对列表中的单词进行排序时,您就没有问题。
猜你喜欢
  • 2022-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多