如何使用正则表达式拆分文本,但分割后的单词仍保留正则表达式分隔符?

5
我有一段文本,使用简单的正则表达式[ \n]将其分割成单词。它使用空格和换行符来分隔文本。
我想知道是否有一种方法可以保留分割后的单词中的空格或换行符,因为我会在一些处理之后用它来进行简单的句子检测。
我正在使用String#split方法。

你的 \n 有特殊意义吗(表示句子结束)?你是否处理多行正常段落,以 "." 结尾的句子? - toto2
@toto2 标点符号也用于确定句子的结尾,但内容来自HTML内容,因此许多像标题这样的句子没有标点符号来确定句子的结尾,只有换行符。 - Renato Dinhani
我不确定你是否应该依赖于“\n”来处理HTML,因为你可以拥有一个完全没有单个“\n”的良好文档。 - toto2
@toto2 我正在处理的文本来自Boilerpipe API(一个外部HTML处理器),它包含了根据HTML内容排列的换行符。 - Renato Dinhani
5个回答

7
你可以像 @Piotr Findeisen 建议的那样使用后顾,具体方式如下:
public class RegexExample{
    public static void main(String[] args) {
    String s = "firstWordWithSpaceAfter secondWordWithSpaceAfter wordWithLineBreakAfter\nlastWord";
    String sa[] = s.split("(?<=[ \\n])");
    for (String saa : sa )
        System.out.println("[" + saa + "]");
    }
}

输出:

[firstWordWithSpaceAfter ]
[secondWordWithSpaceAfter ]
[wordWithLineBreakAfter
]
[lastWord]

短解释: ?<=是正则表达式的“look behind”(向后查找)语法,意思是当你查找的表达式前面的数据等于在?<=之后的正则表达式(在这种情况下为[ \\n])时,你就会得到一个匹配。 [ \\n]是一个正则表达式,意思是[]中的一个字符。
因此,整个正则表达式的含义是每次在表达式/单词之前的字符为空格或\n时拆分。
由于我们没有尝试匹配空格或\n,因此它们不会被移除。

@Renato Dinhani Conceição - 我不是正则表达式专家,但我希望他的编辑足够清晰。 - MByD
您将正则表达式放在括号中。这是必要的吗? - Renato Dinhani
是的,我忘了提到,这是回顾部分的一部分。 - MByD
谢谢你的回答和解释。成功了!:D - Renato Dinhani

5
考虑使用零宽度正向先行 / 后行。请参阅Pattern javadoc中的特殊结构(非捕获)部分。

0

我认为你唯一的选择是像这样做:

String myString = "Joe Blow\n1234 Fake Road\nHere, There, 12345";
String[] lines = myString.split("\\n");
Set<String[]> wordsByLine = new LinkedHashSet<String[]>();
for (String line : lines) {
  wordsByline.add(line.split(" "));
}

0

就我个人而言,如果正则表达式总是匹配单个字符,您可以使用长度确定它们在原始字符串中的位置。然后,您可以为定界字符获取子字符串。

有点不太规范,但应该能解决问题。


-1

我仍然不确定你想做什么,但如果 \n 与 " " 有不同的含义,你应该分别处理它们。

String[] sentences = text.split("\\n");
...
for (String sentence : sentences) {
    ...
    String[] words = sentence.split(" ");
    ...
}

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