使用"混合换行符类型计算行号的算法"

时间:2012-04-11 20:26:31

标签: parsing newline

我需要一个特定的描述(一个对正则表达式等不太混淆的描述),这个算法可以计算一个带有混合换行符的源文件:

'\r', '\n', '\r\n', '\n\r'

我目前有以下算法。可以吗?:

  1. 我确保始终位于第一个换行符字符的“边界”。

  2. 在该事件中,我比较当前的字节字符。

  3. 3.1。如果是'\ n',我将其视为结束当前行并开始换行。

    3.2。如果是'\ r',我会读取下一个字符(如果不超出文本缓冲区的限制),看看它是否为'\ n'。如果是,我将其视为'\ r \ n'换行符。

    3.3。如果它是'\ r',并且下一个字符不是'\ n',我将其视为'\ r'生成的换行符;将当前行标记为已结束并将其计为新行的开头。


    如果它有用,我需要它尝试在通过Web浏览器复制/粘贴的源文件上产生更大的“可移植性”,和/或从具有不同类型的换行符的几个文件中追加,并且我有解析工具我希望确保在所有情况下都有正确和稳健的行为。

1 个答案:

答案 0 :(得分:2)

该算法应涵盖所有案例的99.999%。

您应该以二进制模式而不是文本模式阅读源代码,以确保没有I / O层试图通过将其中一些转换为'\n'来帮助您。

您没有指定您正在使用哪种语言。请注意,在C和C ++中,'\n'与其他转义字符不同,因为它不能保证具有特定值。确实,在大多数实现中,它将映射到ASCII换行符,但使用'\x0A'之类的东西来保持代码可移植性更安全,更明确。

还有一些其他的换行方案,但它们极为罕见。 Unicode中有一个NEL字符,用于与最初在EBCDIC中的文件的往返兼容性(我认为)。 Unicode还引入了LINE SEPARATORPARAGRAPH SEPARATOR,您可能也希望将其视为换行符。但这些非常罕见,处理起来很复杂,因为它们超出了ASCII范围,因此你需要知道你的编码并准备好处理这些问题。