首页 文章

按新行拆分Java字符串

提问于
浏览
337

我正在尝试使用正则表达式在 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 回答

  • 0
    String.split(System.getProperty("line.separator"));
    

    这应该是系统独立的

  • 0

    您不必在字符组中双重转义字符 .

    对于所有非空行使用:

    String.split("[\r\n]+")
    
  • 1

    也许这会奏效:

    从split方法的参数中删除双反斜杠:

    split = docStr.split("\n");
    
  • 113

    这应该涵盖你:

    String lines[] = string.split("\\r?\\n");
    

    您只需要担心两个新行(UNIX和Windows) .

  • 4

    java-11中的 String 类引入了一个新方法 lines ,该方法返回 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
    

    String#lines()

  • 7

    split 方法正在使用正则表达式(正则表达式) . 由于Java 8正则表达式支持 \R 代表(来自documentation of Pattern class):

    Linebreak matcher \ R任何Unicode换行序列,相当于\ u000D \ u000A | [\ u000A \ u000B \ u000C \ u000D \ u0085 \ 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+") .

  • 84

    在所有给定解决方案的基础上尝试失败 . 我用一些特殊的词替换 \n 然后拆分 . 对我来说,遵循了诀窍:

    article = "Alice phoned\n bob.";
    article = article.replace("\\n", " NEWLINE ");
    String sen [] = article.split(" NEWLINE ");
    

    我无法复制问题中给出的例子 . 但是,我想这个逻辑可以应用 .

  • 1

    JDK11 中, String 类具有 lines() 方法:

    返回从此字符串中提取的行的流,由行终止符分隔 .

    此外,documentation继续说:

    行终止符是以下之一:换行符“\ n”(U 000A),回车符“\ _”(U 000D),或回车后紧跟换行符“\ r \” n“(U 000D U 000A) . 一行是零个或多个字符的序列,后跟行终止符,或者是一个或多个字符的序列,后跟字符串的结尾 . 一行不包括行终止符 .

    有了这个可以简单地做:

    Stream<String> stream = str.lines();
    

    那么如果你想要一个数组:

    String[] array = str.lines().toArray(String[]::new);
    

    鉴于此方法返回一个Stream,它为您提供了许多选项,因为它使人们能够编写可能并行操作的简洁和声明性表达式 .

  • 3

    这里给出的所有答案实际上都不尊重Javas对新行的定义,例如在BufferedReader中readline的# . Java正在接受 \n\r\r\n 作为新行 . 一些答案匹配多个空行或格式错误的文件 . 例如 . <sometext>\n\r\n<someothertext> 使用 [\r\n]+ 时会产生两行 .

    String lines[] = string.split("(\r\n|\r|\n)", -1);
    

    相比之下,上面的答案具有以下属性:

    • 它符合Javas对新行的定义,例如BufferedReader正在使用它

    • 它与多个新行不匹配

    • 它不会删除尾随空行

  • 4
    • 试试这个希望对你有所帮助

    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");
    
  • 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]);
            }
        }
    
    }
    
  • 638

    为了保持空行免受压扁使用:

    String lines[] = String.split("\\r?\\n", -1);
    
  • 4

    上面的代码实际上并没有做任何可见的事情 - 它只是计算然后转储计算 . 它是你使用的代码,还是这个问题的一个例子?

    尝试在最后做textAreaDoc.insertString(int,String,AttributeSet)?

  • 41

    设置和显示换行符有三种不同的约定(可以说这些是事实上的标准):

    • carriage return line feed

    • line feed

    • carriage return

    在一些文本编辑器中,可以将一个交换为另一个:

    Notepad++

    最简单的方法是标准化为 line feed 然后拆分 .

    final String[] lines = contents.replace("\r\n", "\n")
                                   .replace("\r", "\n")
                                   .split("\n", -1);
    
  • 1

    如果你不想要空行:

    String.split("[\\r\\n]+")
    
  • -2

    镇上有新男孩,所以你不需要处理上述所有复杂问题 . From JDK 11 onward ,只需要编写单行代码,它就会分割行并返回Stream of String .

    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/

    我希望这会对某人有所帮助 . 快乐的编码 .

  • 11

    作为先前答案的替代方案,如果要对结果线应用其他操作(例如修剪线或过滤空行),则可以使用 Guava 的 Splitter API:

    import com.google.common.base.Splitter;
    
    Iterable<String> split = Splitter.onPattern("\r?\n").trimResults().omitEmptyStrings().split(docStr);
    

    请注意,结果是 Iterable 而不是数组 .

  • 0

    String lines[] =String.split( System.lineSeparator())

  • 0

    如果出于某种原因,您不想使用 String.split (例如,因为regular expressions)并且您希望在Java 8或更高版本上使用函数式编程:

    List<String> lines = new BufferedReader(new StringReader(string))
            .lines()
            .collect(Collectors.toList());
    

相关问题