我有一个字符串:
" Some text here\n Some new line text here"
我需要从中得到:
"----Some text here\n---Some new line text here"
这样行首的每个空格(字符串或换行符)都将被替换为破折号。
不知道如何以最简单的方式实现它。
我有一个字符串:
" Some text here\n Some new line text here"
我需要从中得到:
"----Some text here\n---Some new line text here"
这样行首的每个空格(字符串或换行符)都将被替换为破折号。
不知道如何以最简单的方式实现它。
尝试以下操作:
> " 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"
有一种方法可以使用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, '-'))