2012-04-11 57 views
4

对于可以计算源文件的算法,需要使用特定描述(不会被类似正则表达式等过于模糊的描述)混合换行符:使用“混合换行符类型”对行数进行计数的算法

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

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

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

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

3.1。如果它是'\ n',我把它算作结束当前行并开始一个新行。

3.2。如果它是'\ r',我读下一个字符(如果不超过文本缓冲区的限制),看看它是否是'\ n'。如果是,我把它算作'\ r \ n'换行符。

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


如果它是有用的,我需要它来尝试生产对整个Web浏览器粘贴源文件,这些文件拷贝/更大的“便携性”,和/或具有不同类型的换行符的几个文件追加,并且我有解析工具,我想确保在所有情况下都具有正确和强大的行为。

+1

如果你的问题是“这个算法好吗?”,那么是的,这是完全合理的,也是攻击这个问题最直接的方法(IMO)。 – prelic 2012-04-11 20:29:43

+1

你真的应该学习一个正则表达式是什么。你刚刚做的是将正则表达式“编译”为有限状态机。 – 2012-04-11 20:30:13

+1

@KristopherMicinski - 因为他表示他不想使用RE来实现这种方法,所以假设他知道RE是什么是合理的,并且正在选择(或者某人正在为他选择)而不使用它们。 – prelic 2012-04-11 20:31:29

回答

2

该算法应覆盖99.999%的所有情况。

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

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

换行符还有其他一些方案,但它们非常少见。 Unicode中有一个NEL字符,它与原来在EBCDIC中的文件(我认为)是往返兼容的。 Unicode还引入了LINE SEPARATORPARAGRAPH SEPARATOR,您可能还想将其作为换行符处理。但这些非常罕见,并且可能很难处理,因为它们不在ASCII范围内,因此您需要知道您的编码并准备好处理这些问题。