我试图在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");
}
String#split (String正则表达式)方法使用正则表达式。由于Java 8 regex支持\R,它表示(来自Pattern类的文档):
Linebreak匹配器
\R任何Unicode换行符序列,相当于
(\ \ u000D \ u000A | u000A \ u000B \ u000C \ u000D \ u0085 \ u2028 \ u2029]
所以我们可以用它来匹配:
\u000D\000A -> \r\n对
\u000A ->换行(\n)
\u000B ->行制表(不要与字符制表\t混淆,t是\u0009)
\u000C -> form feed (\f)
\u000D ->回车(\r)
\u0085 -> next line (NEL)
\u2028 ->分割线
\u2029 ->段分隔符
正如你所看到的,\r\n被放置在正则表达式的开头,这确保了正则表达式将首先尝试匹配这对,只有当匹配失败时,它才会尝试匹配单个字符的行分隔符。
所以如果你想拆分行分隔符,请使用split("\\R")。
如果您不想从结果数组中删除尾随空字符串“”,请使用split(regex, limit)和负的limit参数,如split("\\R", -1)。
如果您想将一个或多个连续空行作为单个分隔符,请使用split("\\R+")。
String#split (String正则表达式)方法使用正则表达式。由于Java 8 regex支持\R,它表示(来自Pattern类的文档):
Linebreak匹配器
\R任何Unicode换行符序列,相当于
(\ \ u000D \ u000A | u000A \ u000B \ u000C \ u000D \ u0085 \ u2028 \ u2029]
所以我们可以用它来匹配:
\u000D\000A -> \r\n对
\u000A ->换行(\n)
\u000B ->行制表(不要与字符制表\t混淆,t是\u0009)
\u000C -> form feed (\f)
\u000D ->回车(\r)
\u0085 -> next line (NEL)
\u2028 ->分割线
\u2029 ->段分隔符
正如你所看到的,\r\n被放置在正则表达式的开头,这确保了正则表达式将首先尝试匹配这对,只有当匹配失败时,它才会尝试匹配单个字符的行分隔符。
所以如果你想拆分行分隔符,请使用split("\\R")。
如果您不想从结果数组中删除尾随空字符串“”,请使用split(regex, limit)和负的limit参数,如split("\\R", -1)。
如果您想将一个或多个连续空行作为单个分隔符,请使用split("\\R+")。