Java 查找并保留行的结尾(^M)

Java 查找并保留行的结尾(^M),java,regex,java.util.scanner,dos,end-of-line,Java,Regex,Java.util.scanner,Dos,End Of Line,我正在尝试扫描一个以DOS^m作为行尾的文件,方法如下: Scanner file = new Scanner(new File(saveToFilePath)).useDelimiter("(?=\^M)") 换句话说,我希望逐行阅读文本,但同时保留标记行结束的^M。这对\n来说很容易,但我对正则表达式不太在行,DOS行尾让我抓狂。经过一些研究,我终于找到了它。下面是查找和保留^M的正确正则表达式。我不知道它的意思是CTRL-M,所以您的一些回答对此有所帮助。出于某种原因,“M”不包括在正则

我正在尝试扫描一个以DOS
^m
作为行尾的文件,方法如下:

Scanner file = new Scanner(new File(saveToFilePath)).useDelimiter("(?=\^M)")

换句话说,我希望逐行阅读文本,但同时保留标记行结束的
^M
。这对
\n
来说很容易,但我对正则表达式不太在行,DOS
行尾
让我抓狂。

经过一些研究,我终于找到了它。下面是查找和保留^M的正确正则表达式。我不知道它的意思是CTRL-M,所以您的一些回答对此有所帮助。出于某种原因,“M”不包括在正则表达式中,我不知道它为什么有效,但它确实有效。这为我们提供了一个行分隔符,在搜索难以捉摸的“^M”时,该行包含分隔符(带有先行正则表达式)

扫描仪文件=新扫描仪(源).useDelimiter((?=\p{Cntrl})”


谢谢大家。

也许您需要以二进制模式打开文件,这样您就不会得到自动换行翻译。什么是dos eol,什么是控制代码
^M
?另外,看起来
(?=^M)
是正则表达式。为什么不直接使用
“\\r?\\n”
^M
正是某些文本编辑器显示Windows下线(CRLF或“\r\n”)的方式;它本身不是一个真实的角色。至少,除非您尝试从emacs终端手动将文本复制到新文件中,否则不应该这样做。
^M
是表示
的一种方式,对应于回车符。也表示为\r或十进制值13或十六进制0C。这从来都不是底线。TRS-80、Apple II、Mac OS和OS-9都使用了它。DOS始终使用两个字符的EOL:\r\n(回车换行符)这是一个用于excel的cvs文件。我正在修改一个列,但要绝对确保修改后的文件与原始文件相同,而不是对列的单元格进行修改。但是,一旦我将这些行读入数组并将它们写回文件,当我在vi中打开文件时,eol就消失了。我可以轻松地用“\n”替换eol。我只是担心它会在路上缠住我:)