我正在尝试使用正则表达式在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");
}
答案 0 :(得分:666)
这应该包括你:
String lines[] = string.split("\\r?\\n");
您只需要担心两个新行(UNIX和Windows)。
答案 1 :(得分:123)
如果您不想要空行:
String.split("[\\r\\n]+")
答案 2 :(得分:96)
split
方法正在使用正则表达式(正则表达式)。由于Java 8正则表达式支持\R
代表(来自documentation of Pattern class):
Linebreak matcher
\ R任何Unicode换行序列,相当于\u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029]
所以我们可以用它来匹配:
\u000D\000A
- > \r\n
对\n
)\t
which is \u0009
混淆)\f
)\r
)如您所见,\r\n
位于正则表达式的开头,可确保正则表达式首先尝试匹配此对,并且只有在匹配失败时才会尝试匹配单个字符行分隔符。
因此,如果您想在线分隔符上使用split("\\R")
。
如果don't want to remove from resulting array trailing empty strings ""
split(regex, limit)
使用limit
参数为split("\\R", -1)
,请使用split("\\R+")
。
如果您想将一个或多个连续的空行视为单个分隔符,请使用echo "<a onclick=\"waitingDialog($(this).parents('form'),'/index.php/Taxbrowser_Taxonpage?taxon={$tie}')\"><em>{$tie}</em></a></br>";
。
答案 3 :(得分:44)
String.split(System.getProperty("line.separator"));
这应该是系统无关的
答案 4 :(得分:11)
您不必在字符组中双重转义字符。
对于所有非空行使用:
String.split("[\r\n]+")
答案 5 :(得分:7)
也许这会奏效:
从split方法的参数中删除双反斜杠:
split = docStr.split("\n");
答案 6 :(得分:7)
在java-11中的lines
类中引入了新方法String
,该方法返回Stream<String>
返回从该字符串分区中提取的子字符串流 按行终止符。
识别出的行终止符是换行符“ \ 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
答案 7 :(得分:5)
在JDK11
中,String
类具有lines()
方法:
返回从该字符串中提取的行流,以 行终止符。
此外,documentation继续说:
换行符是以下之一:换行符“ \ n” (U + 000A),回车符“ \ r”(U + 000D)或回车 返回并紧跟换行符“ \ r \ n”(U + 000D U + 000A)。一种 行是零个或多个字符的序列,后跟一个 行终止符,或者是一个或多个字符的序列 然后是字符串的结尾。一行不包含该行 终结者。
有了这个,就可以做到:
Stream<String> stream = str.lines();
然后,如果需要数组:
String[] array = str.lines().toArray(String[]::new);
鉴于此方法可以为您返回Stream,它提供了很多选项,因为它使您可以编写简洁和可能并行操作的声明式表达式。
答案 8 :(得分:5)
这里给出的所有答案实际上都不尊重Javas对新行的定义。 BufferedReader中readline的#。 Java正在接受\n
,\r
和\r\n
作为新行。一些答案匹配多个空行或格式错误的文件。例如。使用<sometext>\n\r\n<someothertext>
时[\r\n]+
会导致两行。
String lines[] = string.split("(\r\n|\r|\n)", -1);
相反,上面的答案具有以下属性:
答案 9 :(得分:4)
为了防止空行被压扁使用:
String lines[] = String.split("\\r?\\n", -1);
答案 10 :(得分:3)
上面的代码实际上并没有做任何可见的事情 - 它只是计算然后转储计算。它是你使用的代码,还是这个问题的一个例子?
尝试在最后执行textAreaDoc.insertString(int,String,AttributeSet)?
答案 11 :(得分:3)
如果出于某种原因,您不想使用String.split
(例如,因为regular expressions)并且您希望在Java 8或更新版本上使用函数式编程:
List<String> lines = new BufferedReader(new StringReader(string))
.lines()
.collect(Collectors.toList());
答案 12 :(得分:1)
在所有给定解决方案的基础上尝试失败。我用一些特殊的词替换\n
然后拆分。对我来说,接下来就是诀窍:
article = "Alice phoned\n bob.";
article = article.replace("\\n", " NEWLINE ");
String sen [] = article.split(" NEWLINE ");
我无法复制问题中给出的例子。但是,我想这个逻辑可以应用。
答案 13 :(得分:1)
作为以前答案的替代方案,如果要对结果线应用其他操作,例如修剪线或过滤空行,则可以使用番石榴的Splitter
API:
import com.google.common.base.Splitter;
Iterable<String> split = Splitter.onPattern("\r?\n").trimResults().omitEmptyStrings().split(docStr);
请注意,结果是Iterable
而不是数组。
答案 14 :(得分:1)
String lines[] =String.split( System.lineSeparator())
答案 15 :(得分:0)
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");
答案 16 :(得分:0)
有三种不同的约定(可以说它们是事实上的标准)来设置和显示换行符:
carriage return
+ line feed
line feed
carriage return
在某些文本编辑器中,可以将一个交换为另一个:
最简单的方法是规范化为line feed
然后拆分。
final String[] lines = contents.replace("\r\n", "\n")
.replace("\r", "\n")
.split("\n", -1);
答案 17 :(得分:0)
镇上有一个新男孩,因此您不需要处理所有上述复杂性。 从JDK 11开始,只需编写为单行代码,它将拆分行并返回字符串流。
public class MyClass {
public static void main(String args[]) {
Stream<String> lines="foo \n bar \n baz".lines();
//Do whatever you want to do with lines
}}
一些参考。 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/
我希望这会对某人有所帮助。编码愉快。
答案 18 :(得分:0)
由于Pshemo在Android上对我有用,因此上述答案对Android没有帮助。我将在这里留下Pshemo's answer的一部分:
split("\\\\n")
答案 19 :(得分:-2)
package in.javadomain;
public class JavaSplit {
public static void main(String[] args) {
String input = "chennai\nvellore\ncoimbatore\nbangalore\narcot";
System.out.println("Before split:\n");
System.out.println(input);
String[] inputSplitNewLine = input.split("\\n");
System.out.println("\n After split:\n");
for(int i=0; i<inputSplitNewLine.length; i++){
System.out.println(inputSplitNewLine[i]);
}
}
}