5

我有一个文本并使用这个简单的正则表达式将其拆分为单词:[ \n]. 它使用空格和换行符将文本拆分为单词。

我想知道是否有办法在拆分的单词中保留空格或换行符,因为我将在一些处理后使用它来进行简单的句子检测。

我正在使用该String#split方法。

4

5 回答 5

7

您可以按照@Piotr Findeisen 的建议(+1)使用lookbehind:

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]

简短说明:

?<=是向后看,这意味着如果您要查找的表达式之前的数据等于后面的正则表达式?<=(在这种情况下[ \\n]) ,则您得到匹配

[ \\n]正则表达式,表示[]

所以整个正则表达式都会说 split 每次表达式/单词之前的字符是空格或\n.

由于我们没有尝试匹配空格或\n,它不会删除它们。

于 2011-08-17T16:32:22.810 回答
5

考虑使用零宽度正向后视/前瞻。请参阅围绕特殊构造(非捕获)的模式 javadoc

于 2011-08-17T16:27:58.693 回答
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(" "));
}
于 2011-08-17T16:29:47.700 回答
0

我很快就想到了,如果正则表达式总是匹配单个字符,你可以使用长度来确定它们在原始字符串中的位置。然后你可以为分隔字符取一个子字符串。

有点脏,但应该可以解决问题。

于 2011-08-17T16:31:47.697 回答
-1

我仍然不确定您要做什么,但是如果 \n 的含义与“”不同,则应分别处理它们。

String[] sentences = text.split("\\n");
...
for (String sentence : sentences) {
    ...
    String[] words = sentence.split(" ");
    ...
}
于 2011-08-17T16:43:35.347 回答