【问题标题】:Detect line breaks in a `char[]`检测 `char[]` 中的换行符
【发布时间】:2014-09-18 14:12:03
【问题描述】:

我使用以下方法来检测字符是否为空格:

Character.isWhiteSpace(char character);

现在我需要检测所有平台(Linux、Windows、Mac OSX 等)的换行符\n\r 等)的所有变体。有没有类似的方法来检测一个字符是否是换行符?如果没有,如何检测所有可能的变体?


从 cmets 编辑:由于我不知道换行符可以由多个字符表示,因此我在问题中添加了一些上下文。

我正在Writer 中实现write(char[] buffer, int offset, int length) 方法(请参阅Javadoc)。除了其他操作,我还需要检测buffer内部的换行符。我试图避免从buffer 创建String 以保留内存,因为我已经看到有时buffer 太大(几MB)。

有没有什么方法可以在不创建String 的情况下检测换行符?

【问题讨论】:

  • 检查 char 是否为 System.getProperty("line.separator")
  • “等”是什么意思?请记住,在 Windows 上,正常的分隔符是 "\r\n",所以不是单个字符。你想解决什么更大的问题?如果您尝试将字符串分成几行,请考虑使用 BufferedReader 包装 StringReader
  • @JonSkeet 不知道换行符可以用两个字符表示,谢谢建议
  • @ThusithaThilinaDayaratne 感谢您的建议,但我正在寻找一种逐个字符检测换行符的方法
  • @JaviFernández,这应该是要走的路。但是,您不能在 Java 中“逐个字符”地测试换行符,因为它通常是一个序列。所以需要在String中找到序列...

标签: java text character


【解决方案1】:

使用正则表达式为您完成工作:

if (!String.valueOf(character).matches("."))

没有DOTALL开关,点匹配所有字符除了换行符,根据documentation包括:

  • 换行(换行)字符 ('\n'),
  • 回车符后紧跟换行符 ("\r\n"),
  • 独立的回车符 ('\r'),
  • 下一行字符 ('\u0085'),
  • 行分隔符 ('\u2028'),或
  • 段落分隔符 ('\u2029)。

请注意,存在换行序列,例如\r\n,但您询问的是单个字符。正则表达式解决方案适用于一两个字符输入。

【讨论】:

  • 感谢您的回答!有没有其他换行符?这也适用于 Windows 吗?
  • @JaviFernández 我挖得更深——还有其他人。查看答案,以及更完整的解决方案
  • @Martin 正则表达式方法也适用于序列,例如"\r\n"
  • 作为@Martin cmets,这仅适用于字符而不适用于序列,但换行符的所有可能字符列表是我一直在寻找的东西之一,谢谢!!跨度>
  • @JaviFernández,这不是不便,只是一个建议,让您的问题尽可能有价值并获得最佳答案。
【解决方案2】:

正如我在 cmets 中发布的,行分隔符并不总是一个“字符”,而是一个字符序列,具体取决于平台。要独立,它看起来像这样:

public String[] splitLines(String input) {
    return input.split("(\r\n|\r|\n)");
}

基于这个答案:

Match linebreaks - \n or \r\n?

但是,这意味着正则表达式匹配,而不是字符匹配...但是从缓冲区中获取字符串应该是可以实现的...

【讨论】:

  • 非常感谢您的回答@Martin,但是为每个缓冲区创建一个字符串是我试图避免的事情之一。如果采用不同的方法,我会考虑这个答案。
  • 那很好......也许你需要看看你的 char 缓冲区来自哪里......如果你将在编写器中使用它,它必须在某个地方生成,我会假设它来自一个字符串...如果您查看 (char[]) 的字符串构造函数,它使用 Arraycopy,所以它不是那么昂贵:grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/…。如果您需要涵盖所有情况,则必须进行正则表达式匹配而不是字符匹配...
【解决方案3】:

您可以使用

获取操作系统相关的行分隔符
System.getProperty("line.separator")

这将返回一个字符串。

但是由于您正在尝试使用 char,因此检查 char 是 '\n' 还是 'r' 是否正确。

if(yourChar == '\r' || yourChar == '\n')

【讨论】:

  • 那么换行符是否只有两个可能的字符?
猜你喜欢
  • 2012-07-15
  • 1970-01-01
  • 1970-01-01
  • 2012-03-04
  • 2013-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-18
相关资源
最近更新 更多