2017-09-01 29 views
1

我有一些代码,输出如下:几乎根据需要的JavaScript更换所有,但最后,同时保留原来的换行符

function replaceAllButLast(str, splitRegex, pOld, pNew) { 
 
    var parts = str.split(splitRegex) 
 
    if (parts.length === 1) return str 
 
    return parts.slice(0, -1).join(pNew) + pOld + parts.slice(-1) 
 
} 
 

 
var str = "fred\r\nfred\r\nfred\r\n" 
 
var desiredResult = replaceAllButLast(str, /(?:\r?\n|\r)/, '\n', '\n+') 
 

 
console.log(desiredResult)

结果。但是,代码假定正则表达式拆分操作正在拆分\ n,因此将其替换为\ n

但是,它实际上可能会拆分为\ r \ n(windows - 如示例中)或\ r (old macs)

有没有人有一些代码会给出与代码相同的输出,但是会保留原始换行符,同时在换行符后面加上+(最后一行除外)。

我正在使用纯香草JavaScript。

PS我必须使用正则表达式/(?:\r?\n|\r)/

PPS有没有必要使用.split()

回答

1

这将保留最后换行符,因为它不过是别人加了+,见replace

var str = "fred\r\nfred\r\nfred\r\n"; 
 
var splitRegexp = new RegExp(/(?:\r?\n|\r)/, 'g') 
 

 
var newstr = str.replace(splitRegexp, function(match, offset, string) { 
 
    var follow = string.slice(offset); 
 
    var isLast = follow.match(splitRegexp).length == 1; 
 

 
    if (!isLast) { 
 
    return match + '+'; 
 
    } else { 
 
    return match; 
 
    } 
 
}) 
 
console.log(newstr)

+0

真的很好回答thx - 甚至不知道替换可以使用函数 – danday74

1

我换成可见字符的正则表达式,所以你可以看到发生了什么事情:

var input = "fredEOLfredENDLfredFINfred"; 
 
input = input.replace(/(EOL|ENDL|FIN)/g, "$1+"); 
 
console.log(input);

相关问题