**本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看 活动链接 **
问题:
我尝试使用正则表达式\n去分割文本区的文本,然而行不通。然后我又尝试了\r\n|\r|n及其他的正则表达式组合,代码如下:
public void insertUpdate(DocumentEvent e) {
String split[], docStr = null;
Document textAreaDoc = (Document)e.getDocument();
try {
docStr = textAreaDoc.getText(textAreaDoc.getStartPosition().getOffset(), textAreaDoc.getEndPosition().getOffset());
} catch (BadLocationException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
split = docStr.split("\\n");
}
------------------------------以下为回答,按支持票数排序----------------------------------
回答1(支持票数785):
将代码中的
split = docStr.split("\\n");
替换为
split = docStr.split("\\r?\\n");
后,就可以解决你的问题,匹配到两种系统(linux和window)中的换行符
回答2(支持票数152):
String类的split(String regex)方法可以使用正则表达式[regex(regular expressions)],
java从java8起正则表达式支持\R (在java官方文档Pattern 类中有说明,链接:docs.oracle.com/javase/8/do…):
换行符 匹配
\R 可以匹配任意字符集换行符, 等同于\u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029]
所以我们可以用它去匹配到如下换行符:
\u000D\000A->\r\n- \u000A -> 换行line feed (
\n) - \u000B -> 表格换行line tabulation (DO NOT confuse with character tabulation
\twhich is\u0009) - \u000C -> 换页form feed (
\f) - \u000D -> 回车carriage return (
\r) - \u0085 -> 下一行next line (NEL)
- \u2028 -> 行分隔line separator
- \u2029 -> 段落分隔paragraph separator
可见\R是原理上是优先使用\r\n进行匹配,当\r\n匹配不到时才用单字符换行符去匹配
If you don't want to remove from resulting array trailing empty strings "" use split(regex, limit) with negative limit parameter like split("\\R", -1).
If you want to treat one or more continues empty lines as single delimiter use split("\\R+").
因此,如果你想要通过行分隔符进行分隔,应使用split("\\R")。
如果你想要保留结果数组中的空字符串应使用String的split(regex, limit)方法,参数为split("\\R", -1)
如果你想要把一个或多个空号视为单个定界符就是使用split("\\R+")。
文章翻译自Stack Overflow :链接