我正在尝试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"); }
cletus.. 694
这应该涵盖你:
String lines[] = string.split("\\r?\\n");
您只需要担心两个新行(UNIX和Windows).
这应该涵盖你:
String lines[] = string.split("\\r?\\n");
您只需要担心两个新行(UNIX和Windows).
如果你不想要空行:
String.split("[\\r\\n]+")
String#split?(String regex)
方法是使用正则表达式(正则表达式).由于Java 8正则表达式支持\R
代表(来自Pattern类的文档):
Linebreak matcher
\R任何Unicode换行序列,相当于\u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029]
所以我们可以用它来匹配:
\u000D\000A
- > \r\n
对
\ u000A - >换行(\n
)
\ u000B - >线制表(不要混淆字符制表\t
这是\u0009
)
\ u000C - >表单Feed(\f
)
\ u000D - >回车(\r
)
\ u0085 - >下一行(NEL)
\ u2028 - >行分隔符
\ u2029 - >段落分隔符
如您所见,\r\n
它位于正则表达式的开头,它确保正则表达式首先尝试匹配该对,并且只有当该匹配失败时,它才会尝试匹配单个字符行分隔符.
所以如果你想拆分线上分隔符使用split("\\R")
.
如果你不想从结果数组中删除空字符串,请""
使用split(regex, limit)
负limit
参数之类的split("\\R", -1)
.
如果要将一个或多个连续的空行视为单个分隔符使用split("\\R+")
.
String.split(System.getProperty("line.separator"));
这应该是系统独立的
您不必在字符组中双重转义字符.
对于所有非空行使用:
String.split("[\r\n]+")
在java-11中lines
引入了一个新方法,该方法返回String
Stream
返回从由行终止符分区的此字符串中提取的子字符串流.
识别的行终止符是换行符"\n"(U + 000A),回车符"\ r"(U + 000D)和回车后紧跟换行符"\ r \n"(U + 000D U + 000A) ).
这里有一些例子:
jshell> "lorem \n ipusm \n sit".lines().forEach(System.out::println) lorem ipusm sit jshell> "lorem \n ipusm \r sit".lines().forEach(System.out::println) lorem ipusm sit jshell> "lorem \n ipusm \r\n sit".lines().forEach(System.out::println) lorem ipusm sit
串#线()
也许这会奏效:
从split方法的参数中删除双反斜杠:
split = docStr.split("\n");
实际上,这里给出的所有答案都不符合Java对新行的定义,例如BufferedReader#readline。Java正在接受\n
,\r
并将其\r\n
作为新行。一些答案匹配多个空行或格式错误的文件。例如。
使用时[\r\n]+
将导致两行。
String lines[] = string.split("(\r\n|\r|\n)", -1);
相反,以上答案具有以下属性:
它符合Java对新行的定义,例如BufferedReader正在使用它
它与多个新行不匹配
它不会删除尾随的空行
在JDK11
所述String
类有一个lines()
方法:
返回从此字符串中提取的行流,以行终止符分隔。
此外,文档继续说:
行终止符是以下之一:换行符“ \ n”(U + 000A),回车符“ \ r”(U + 000D)或回车符后紧跟换行符“ \ r \ n“(U + 000D U + 000A)。行要么是零个或多个字符的序列,后跟一个行终止符,要么是一个或多个字符的序列,后跟字符串的结尾。一行不包括行终止符。
有了这个,就可以做到:
Streamstream = str.lines();
然后,如果您想要一个数组:
String[] array = str.lines().toArray(String[]::new);
给定此方法后,Stream将为您提供很多选择,因为它使您能够编写可能并行操作的简洁声明式表达式。
如果由于某种原因而不想使用String.split
(例如,由于使用正则表达式),并且想要在Java 8或更高版本上使用函数式编程,请执行以下操作:
Listlines = new BufferedReader(new StringReader(string)) .lines() .collect(Collectors.toList());