ruby gsub 换行符

ruby gsub new line characters

我有一个包含换行符的字符串,我想将其 gsub 换成白色 space。

"hello I\r\nam a test\r\n\r\nstring".gsub(/[\r\n]/, ' ')

类似这样的事情 ^ 只有我的正则表达式似乎也在替换 'r''n' 字母。另一个限制是有时模式会重复两次,因此会被连续的两个白色 space 替换,虽然这不是可取的,但它比所有文本都被切开要好。

如果有办法只select换行符。或者,如果在使用正则表达式之外还有更简单的方法来解决这个问题,那就更好了?

如果您想用单个 space 替换连续的混合换行符,您可以使用以下正则表达式解决方案:

s.gsub(/\R+/, ' ')

参见Ruby demo

\R 匹配任何类型的换行符,+ 匹配一次或多次出现的量化子模式。

请注意,如果您必须处理旧版本的 Ruby,您将需要使用 否定字符 class [\r\n] 匹配 \r\n:

.gsub(/[\r\n]+/, ' ')

或 - 添加所有可能的换行符:

/gsub(/(?:\u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029])+/, ' ')

这应该适用于您的测试用例:

"hello I\r\nam a test\r\n\r\nstring".gsub(/[\r\n]/, ' ')

如果您不希望连续的 \r\n 个字符导致重复的空格,您可以使用此代替:

"hello I\r\nam a test\r\n\r\nstring".gsub(/[\r\n]+/, ' ')

(注意字符class后加了+。)

正如 Wiktor 所提到的,您在正则表达式中使用了 \,它在正则表达式文字 /.../ 中实际上转义了一个反斜杠,这意味着您匹配的是文字反斜杠 \rn 作为表达式的一部分。转义字符在正则表达式中的工作方式不同,因为 \ 被广泛使用,因此对其进行特殊转义是没有意义的(与常规字符串相反,后者是完全不同的动物)。