【发布时间】:2018-07-21 20:27:49
【问题描述】:
我正在开发抄袭检测软件的一部分,需要使用正则表达式和拆分方法将字符串拆分为单词子组。
假设我们有以下字符串,并希望将其分成三个单词。在这种情况下 split(regex) 应该在每三个空格之后分割句子。
样本数据: "It is a long established fact that"
样本输出: "It is a", "long established fact"
这是代码的简化版本,包括我正在处理的部分。我设法在每两个词之后拆分,但在 n=3 时无法拆分。
public class String {
public void Splitter(String string){
//string:"It is a long established fact that"
String[] splitString =string.split("(?<!\\G\\S+)\\s");
}
}
以上代码的输出如下:
splitString[0] = "It is"
splitString[1] = "a long"
splitString[2] = "established fact"
然后我想出了这个正则表达式(?<=\\G\\s{2})\\s“如果前面还有两个空格,则匹配每个空格。”并期望输出为"It is a", "long established fact",但数组为空。
这是我刚刚构建的另一个正则表达式:("(?<=(^|\\G)\\S*\\s\\S*\\s\\S*)\\s") 它几乎可以完成这项工作。唯一的问题是,如果句子中的单词总数不能被 n 整除,那么最后一组单词可以包含少于 n 个单词,splitString[3] = "that"
【问题讨论】:
-
我宁愿用 whitechar 拆分所有内容并从中形成所需的组
-
(?<=\s+\S+\s+\S+)\s但它是可变长度的后视。您应该使用\s*(\S+\s+\S+\s+\S+)(?=\s|$)|.+匹配所有内容,这将匹配字符串的每个部分。 -
@Antoniossss 我也这么认为。但我宁愿使用 split(regex) 代替。
-
@sln 我尝试了你对正则表达式的两个建议,但第一个返回了相同的字符串,第二个返回了一个空的字符串数组。