我正在尝试使用正则表达式在 JTextArea
中拆分文本以将字符串拆分为 \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");
}
19 回答
这应该是系统独立的
您不必在字符组中双重转义字符 .
对于所有非空行使用:
也许这会奏效:
从split方法的参数中删除双反斜杠:
这应该涵盖你:
您只需要担心两个新行(UNIX和Windows) .
java-11中的
String
类引入了一个新方法lines
,该方法返回Stream<String>
这里有一些例子:
String#lines()
split
方法正在使用正则表达式(正则表达式) . 由于Java 8正则表达式支持\R
代表(来自documentation of Pattern class):所以我们可以用它来匹配:
\u000D\000A
- >\r\n
对\u000A - >换行(
\n
)\u000B - >行列表(不要与character tabulation \t which is \u0009混淆)
\u000C - >换页(
\f
)\u000D - >回车(
\r
)\u0085 - >下一行(NEL)
\u2028 - >行分隔符
\u2029 - >段落分隔符
如您所见
\r\n
位于正则表达式的开头,这确保正则表达式将首先尝试匹配此对,并且只有当该匹配失败时,它才会尝试匹配单个字符行分隔符 .因此,如果要拆分行分隔符,请使用
split("\\R")
.如果don't want to remove from resulting array trailing empty strings ""使用
split(regex, limit)
,负limit
参数,如split("\\R", -1)
.如果要将一个或多个连续的空行视为单个分隔符,请使用
split("\\R+")
.在所有给定解决方案的基础上尝试失败 . 我用一些特殊的词替换
\n
然后拆分 . 对我来说,遵循了诀窍:我无法复制问题中给出的例子 . 但是,我想这个逻辑可以应用 .
在
JDK11
中,String
类具有lines()
方法:此外,documentation继续说:
有了这个可以简单地做:
那么如果你想要一个数组:
鉴于此方法返回一个Stream,它为您提供了许多选项,因为它使人们能够编写可能并行操作的简洁和声明性表达式 .
这里给出的所有答案实际上都不尊重Javas对新行的定义,例如在BufferedReader中readline的# . Java正在接受
\n
,\r
和\r\n
作为新行 . 一些答案匹配多个空行或格式错误的文件 . 例如 .<sometext>\n\r\n<someothertext>
使用[\r\n]+
时会产生两行 .相比之下,上面的答案具有以下属性:
它符合Javas对新行的定义,例如BufferedReader正在使用它
它与多个新行不匹配
它不会删除尾随空行
为了保持空行免受压扁使用:
上面的代码实际上并没有做任何可见的事情 - 它只是计算然后转储计算 . 它是你使用的代码,还是这个问题的一个例子?
尝试在最后做textAreaDoc.insertString(int,String,AttributeSet)?
设置和显示换行符有三种不同的约定(可以说这些是事实上的标准):
carriage return
line feed
line feed
carriage return
在一些文本编辑器中,可以将一个交换为另一个:
最简单的方法是标准化为
line feed
然后拆分 .如果你不想要空行:
镇上有新男孩,所以你不需要处理上述所有复杂问题 . From JDK 11 onward ,只需要编写单行代码,它就会分割行并返回Stream of String .
一些参考 . https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/String.html#lines()https://www.azul.com/90-new-features-and-apis-in-jdk-11/
我希望这会对某人有所帮助 . 快乐的编码 .
作为先前答案的替代方案,如果要对结果线应用其他操作(例如修剪线或过滤空行),则可以使用 Guava 的
Splitter
API:请注意,结果是
Iterable
而不是数组 .String lines[] =String.split( System.lineSeparator())
如果出于某种原因,您不想使用
String.split
(例如,因为regular expressions)并且您希望在Java 8或更高版本上使用函数式编程: