按列表中的单词将没有空格的文本拆分为单词。

4
我有三个列表,现在我要将它们合并为一个列表。
    static List allLists = Stream.of(list1, list2, list3)
        .flatMap(Collection::stream)
        .collect(Collectors.toList());

我有一个没有空格的用户输入。
String = "HelloIwanttobookanonlineseminaratyourcompany"

所有用户输入中的单词都已经在“allLists”中。我想要遍历“allLists”,并在找到每个单词时向字符串中插入空格。结果应该是:
String = "Hello I want to book an online seminar at your company"

有没有我错过的简单解决方案?


3
由于可能我想预订在线研讨会,所以并没有简单的解决办法。换句话说,使用相同的词汇列表可以有多种将相同字符串进行分词的方式。 - Andy Turner
1
但是如果我的列表中包含“an”和“online”,但不包含“anon”,那么它应该只扫描我的列表中的单词。 - user7739383
1
再次强调,可能会出现单词"He"和单词"Hello"。对于您的示例,期望的输出是什么? - zlakad
在这种情况下,allLists 中只会有单词 "hello",而不是单词 "he"。 - user7739383
1
好的,也许我没有表达清楚。我的问题是:如果您的allList中有"he"、"hello"和"llo"(如果我们可以假设"llo"是可接受的单词),那该怎么办? - zlakad
显示剩余3条评论
1个回答

2
使用一个单行代码,利用由allLists构建的(巨大)回溯来在每个单词前插入空格:
str = str.replaceAll("(?<=" + String.join("|", allLists) + ")", " ");

请注意,allLists 中单词的顺序很重要;如果您希望更长的单词优先考虑,请首先列出它们(建议如此)。例如,如果您的列表中同时包含“book”和“booking”,请将“booking”放在“book”之前,否则您的结果会出现“book ing”。

请帮我理解你的答案(因为我不喜欢正则表达式)。如果我有book,booking,boo,king,那么在allList中单词的顺序应该是什么? - zlakad
非常感谢!我会尝试这个。 - user7739383
按照间距的优先顺序列出单词 - 第一个匹配项后面会有一个空格。这个解决方案很“简单”,但可能不适用于您,因为如果无法找到一条路径使结果仅为已知单词,则它不会回溯字符串。 - Bohemian
1
@colin 我稍微修改了一下,使用了后顾之忧而不是前瞻。 - Bohemian
无论列表中出现“book”和“booking”的顺序如何,回溯都将始终在向后查找时检测到它们,因为它们出现在不同的文本位置。当使用前瞻时,可以构造类似的问题示例,更不用说在两种情况下都可以找到嵌入另一个单词中间的单词了。错误始于决定使用零宽度模式,而不是消耗该单词。当您使用str.replaceAll(String.join("|", allLists), "$0 ")并按列表中的单词排序时,就不会有这个问题。 - Holger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接