1

我有一个字符串:

"    Some text here\n   Some new line text here"

我需要从中得到:

"----Some text here\n---Some new line text here"

这样行首的每个空格(字符串或换行符)都将被替换为破折号。

不知道如何以最简单的方式实现它。

4

2 回答 2

4

尝试以下操作:

> "    Some text here\n   Some new line text here".replace(/^\s+/gm, '----')
"----Some text here\m----Some new line text here"

或者:

"    Some text here\n   Some new line text here".replace(/^\s+/gm, function(spaces) { return spaces.replace(/./g, '-'); } )
"----Some text here\m----Some new line text here"
于 2013-10-03T07:54:53.493 回答
0

有一种方法可以使用lookbehind 单独匹配每个前导模式,但这是仅兼容ECMAScript 2018+ 的解决方案。

可以在此处跟踪Lookbehind 采用情况,请参阅RegExp Lookbehind Assertions。目前,Chrome、Edge、Opera 包括 Opera Mobile、Samsung Internet 和 Node.js 都支持它们。Firefox将于 2020 年 6 月 30 日向 SpiderMonkey RegExp 引擎添加“对 dotAll 标志、后向引用、命名捕获和 Unicode 转义序列的支持”。

当前场景的解决方案:

.replace(/(?<=^\s*)\s/gm, '-')

在这里,/(?<=^\s*)\s/gm匹配任何\s紧跟在行首的任何 0+ 空白字符之前的空白字符 ( )(请参见后面的(?<=^\s*)肯定)。请参阅此正则表达式演示

注意:由于\s匹配换行符,所有空行也将替换为连字符。如果必须保留空行,请使用[^\S\n\v\f\r\u2028\u2029而不是\s

.replace(/(?<=^[^\S\n\v\f\r\u2028\u2029]*)[^\S\n\v\f\r\u2028\u2029]/gm, '-')

where[^\S\n\v\f\r\u2028\u2029]匹配除换行符、垂直制表符、换页符、回车符、行和段落分隔符以外的任何空白字符。请参阅此正则表达式演示

JS 演示:

// Any whitespace chars
console.log("    Some text here\n\n   Some new line text here"
     .replace(/(?<=^\s*)\s/gm, '-'))

// Only horizontal whitespace
console.log("    Some text here\n\n   Some new line text here"
     .replace(/(?<=^[^\S\n\v\f\r\u2028\u2029]*)[^\S\n\v\f\r\u2028\u2029]/gm, '-'))

于 2020-04-26T17:55:07.790 回答