一个跨平台的正则表达式用于去除换行符是什么?

32
我相信这个问题以前已经被问过,但我找不到它。基本上,假设您正在解析一个未知来源的文本文件并想要将换行符替换为其他分隔符,那么这是最好的正则表达式,还是有其他更好的选择?该正则表达式为:(\r\n)|(\n)|(\r)

1
你关心旧版Mac风格的换行符(\r)吗?还是只关心Unix和Windows(\n\r\n)? - Joe White
1
可能是重复的问题:正则表达式匹配跨平台换行符 - Amarghosh
5个回答

44

Fletcher - 这个问题之前确实被问过。

这是你要的链接:正则表达式匹配跨平台换行符

  • 剧透警告!

当我想要精确匹配时,我使用的正则表达式是"\r\n?|\n"。


23

请检查您的正则表达式引擎是否支持\R作为速记字符类,这样您就不必担心各种Unicode换行符/行进组合。如果正确实现,则可以使用\R透明地匹配所有各种ascii或Unicode行结尾。

在Unicode中,如果您想完全跨平台,需要检测NEL(OS/390行结尾,\x85)LS(行分隔符,\x2028)和PS(段落分隔符,\x2029)。

LS、NEL和PS是否应被视为换行符、行结尾或空格存在争议。例如,XML 1.0标准不承认 NEL 作为换行符。ECMAScript将LSPS视为换行符,但将NEL视为空格。Perl Unicode regexs 将VTFFCRCRLFNELLSPS作为^$ regex元字符的换行符。

Unicode Implementation Guide(第5.8节和表5.3)可能是“换行符”的最权威定义。

如果您只关心DOS / Windows / Unix / Mac经典变体的ASCII,则与\R等效的正则表达式为(?>\r\n|[\r\n])

在Unicode中,与\R相当的是(?>\r\n|\n|\x0b|\f|\r|\x85|\x2028|\x2029) 其中的\x0b是垂直制表符,这可能或可能不符合您对换行符的定义,但这符合Unicode实施的建议。(FF\x0C未包含在正则表达式中,因为换页符表示新页而不是新行。)

"utf8"在这里应该是“Unicode”。UTF-8仅仅是Unicode字符编码之一。 - Alan Moore
你是对的,但是我所参考的文档(PCRE 手册),也有相同的问题!已经进行了编辑... - dawg
2
在Java中,\x2028|\x2029部分必须写成\u2028|\u2029,因为\xhh仅用于2位十六进制字符值,而\uhhhh用于4位十六进制字符值。 - Christian Semrau

2

查找任何Unicode行终止符的正则表达式应该为(?>\x0D\x0A?|[\x0A-\x0C\x85\x{2028}\x{2029}]),至少在Perl中是这样的。直接取自perl 5.10.0文档(在后来的版本中已被删除)。请注意\x后面的大括号:U+2029是\x{2029},而\x2029是ASCII空格(U+0020)+数字2 + 数字9。在字符类之外的\n也不能保证与\x{0a}匹配。


1
如果你的平台不支持@dawg建议的\R类,但如果你的平台支持负环视或字符类减法(例如,在Java中,类减法是通过语法[x&&[^y]]实现的),那么你仍然可以制作一个相当优雅且健壮的解决方案。
在大多数正则表达式语法中,点字符被定义为“除换行符之外的任何字符”(例如,对于JavaScript,请参见此处)。如果你匹配具有以下特征的内容:
  1. 不是(任何字符除了换行符)→ 换行符;和
  2. 是空白字符
由于我目前正在使用JavaScript,它似乎没有\R简写或字符类减法,我仍然可以使用负向前瞻来获得所需结果。以下正则表达式匹配所有换行符:
/((?!.)\s)+/g

以下 JavaScript 代码在 Windows 7 上的 Chrome 42.0.2311.90m 中运行时,至少会清除 JavaScript(即 @dawg 第三段提到的“ECMAScript”)所识别的所有换行符:

var input = "hello\r\n\f\v\u2028\u2029 world";
var output = input.replace(/((?!.)\s)+/g, "");
document.write(output); // hello world


0

只需将/[\r\n]+/g替换为空字符串""

它将替换字符串中出现的所有\r\n,无论它们以什么顺序出现。


这将用一个替换标记替换任意数量的换行符。 - Andreas Jansson
@Andreas 他想要移除换行符。 - Amarghosh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接