java - 字符串中的换行符检测

时间:2015-03-11 14:54:45

标签: java string newline

我知道有几次问过类似的问题,但我看到的答案要么是变通办法,要么就是不正确。

基本问题很简单:一个方法给我一个从文件读取的字符串,我需要检查这个字符串是否包含换行符。

现在到了棘手的部分:Wikipedia目前列出了八种类型的字符或字符组合,这些字符或字符组合可能依赖于系统表示换行符。因此,检查常见的\n\r,我经常阅读的答案是不可行的。遍历字符串并将其字符与System.getProperty("line.separator")进行比较也可能会失败,因为可能的换行符表示为“\ r \ n”,这将触发此比较两次,但只有一个换行符。

然而,这必须是可能的。我错过了什么选择?

2 个答案:

答案 0 :(得分:1)

您可以尝试使用正则表达式\r?\n,其中\r是可选的。

示例代码:

    String str = "abc\r\nlmn\nxyz";
    Pattern pattern = Pattern.compile("\r?\n");
    Matcher matcher = pattern.matcher(str);
    int count=0;
    while(matcher.find()){
        count++;
    }
    System.out.println(count);    // prints 2

答案 1 :(得分:1)

您可以将正则表达式模式^(.*)$与修饰符Pattern.MULTILINE一起使用。检查字符串是否包含任何新行字符的方法如下所示:

static boolean containsNewLine(String str) {
    Pattern regex = Pattern.compile("^(.*)$", Pattern.MULTILINE);
    return regex.split(str).length > 0;
}

它将字符串拆分为n个部分,具体取决于换行符的数量。如果字符串包含任何换行符,则length将大于0。

通常^$只匹配字符串的开头和结尾,但您可以通过传递Pattern.MULTILINE来更改此行为。来自docs

  

在多行模式下,表达式^和$分别在行终止符之后或之前或输入序列的末尾匹配。默认情况下,这些表达式仅匹配整个输入序列的开头和结尾。