我有一个文本并使用这个简单的正则表达式将其拆分为单词:[ \n]
. 它使用空格和换行符将文本拆分为单词。
我想知道是否有办法在拆分的单词中保留空格或换行符,因为我将在一些处理后使用它来进行简单的句子检测。
我正在使用该String#split
方法。
您可以按照@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
,它不会删除它们。
考虑使用零宽度正向后视/前瞻。请参阅围绕特殊构造(非捕获)的模式 javadoc
我认为你唯一的选择是做这样的事情:
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(" "));
}
我很快就想到了,如果正则表达式总是匹配单个字符,你可以使用长度来确定它们在原始字符串中的位置。然后你可以为分隔字符取一个子字符串。
有点脏,但应该可以解决问题。
我仍然不确定您要做什么,但是如果 \n 的含义与“”不同,则应分别处理它们。
String[] sentences = text.split("\\n");
...
for (String sentence : sentences) {
...
String[] words = sentence.split(" ");
...
}