(\r\n)|(\n)|(\r)
。请检查您的正则表达式引擎是否支持\R
作为速记字符类,这样您就不必担心各种Unicode换行符/行进组合。如果正确实现,则可以使用\R
透明地匹配所有各种ascii或Unicode行结尾。
在Unicode中,如果您想完全跨平台,需要检测NEL
(OS/390行结尾,\x85)LS
(行分隔符,\x2028)和PS
(段落分隔符,\x2029)。
LS、NEL和PS是否应被视为换行符、行结尾或空格存在争议。例如,XML 1.0标准不承认 NEL 作为换行符。ECMAScript将LS
和PS
视为换行符,但将NEL
视为空格。Perl Unicode regexs 将VT
、FF
、CR
、CRLF
、NEL
、LS
和PS
作为^
和$
regex元字符的换行符。
Unicode Implementation Guide(第5.8节和表5.3)可能是“换行符”的最权威定义。
如果您只关心DOS / Windows / Unix / Mac经典变体的ASCII,则与\R
等效的正则表达式为(?>\r\n|[\r\n])
。
\R
相当的是(?>\r\n|\n|\x0b|\f|\r|\x85|\x2028|\x2029)
其中的\x0b
是垂直制表符,这可能或可能不符合您对换行符的定义,但这符合Unicode实施的建议。(FF
或\x0C
未包含在正则表达式中,因为换页符表示新页而不是新行。)\x2028|\x2029
部分必须写成\u2028|\u2029
,因为\xhh
仅用于2位十六进制字符值,而\uhhhh
用于4位十六进制字符值。 - Christian Semrau查找任何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}
匹配。
\R
类,但如果你的平台支持负环视或字符类减法(例如,在Java中,类减法是通过语法[x&&[^y]]
实现的),那么你仍然可以制作一个相当优雅且健壮的解决方案。\R
简写或字符类减法,我仍然可以使用负向前瞻来获得所需结果。以下正则表达式匹配所有换行符:/((?!.)\s)+/g
var input = "hello\r\n\f\v\u2028\u2029 world";
var output = input.replace(/((?!.)\s)+/g, "");
document.write(output); // hello world
只需将/[\r\n]+/g
替换为空字符串""
。
它将替换字符串中出现的所有\r
和\n
,无论它们以什么顺序出现。
\r
)吗?还是只关心Unix和Windows(\n
和\r\n
)? - Joe White