2017-09-01 45 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);