替换最后出现的两个波浪号中的 JavaScript 字符串 ~~

Replacing a JavaScript string in the last occurrence of two tildes ~~

我有一个如下所示的字符串:

Mon Jan 24 2022 09:28:10 GMT+0100 (Mitteleuropäische Normalzeit)~~Admin_SA, SharePoint (i:0#.w|xespsa)~~00-Entwurf~~15-Indirekter Einkauf~~~~
Mon Jan 24 2022 09:28:20 GMT+0100 (Mitteleuropäische Normalzeit)~~Admin_SA, SharePoint (i:0#.w|xespsa)~~00-Entwurf~~15-Indirekter Einkauf~~~~
Tue Jan 25 2022 20:51:17 GMT+0100 (Mitteleuropäische Normalzeit)~~Admin_SA, SharePoint (i:0#.w|xespsa)~~15-Indirekter Einkauf~~15-Indirekter Einkauf~~Comment 1~~
Tue Jan 25 2022 20:58:34 GMT+0100 (Mitteleuropäische Normalzeit)~~Admin_SA, SharePoint (i:0#.w|xespsa)~~15-Indirekter Einkauf~~15-Indirekter Einkauf~~Comment 2~~

我遇到的问题如下:

在最后一次出现波浪号 (~~) 之间我们有 Comment 2。 我想用另一个值替换该值,例如 Comment 3.

我的解决方案是这样的:https://jsfiddle.net/13wrpa2b/

alert(str[19]) // Comment 2

str[19] = "Comment 3"; 

let concat = str.join('~~');
alert(concat);

问题是我并不总是知道日志的确切长度,而且评论不一定必须在第 19 位。但我知道它总是在最后一次出现的波浪号之间~~。

我怎样才能做到这一点?

您可以尝试以下方法:

const arr = logentry.split('~~');
arr[arr.length-2] = 'My custom stuff'; // this is now the last block in the line
const updatedLine = arr.join('~~'));
alert(updatedLine);

因为字符串末尾有两个波浪号,所以数组看起来像 [..., "Comment 2", ""]。因此该项目位于倒数第二个位置,因此您可以使用 str.length - 2.

而不是 19

let str = 'Mon Jan 24 2022 09:28:10 GMT+0100 (Mitteleuropäische Normalzeit)~~Admin_SA, SharePoint (i:0#.w|xespsa)~~00-Entwurf~~15-Indirekter Einkauf~~~~ Mon Jan 24 2022 09:28:20 GMT+0100 (Mitteleuropäische Normalzeit)~~Admin_SA, SharePoint (i:0#.w|xespsa)~~00-Entwurf~~15-Indirekter Einkauf~~~~ Tue Jan 25 2022 20:51:17 GMT+0100 (Mitteleuropäische Normalzeit)~~Admin_SA, SharePoint (i:0#.w|xespsa)~~15-Indirekter Einkauf~~15-Indirekter Einkauf~~Comment 1~~ Tue Jan 25 2022 20:58:34 GMT+0100 (Mitteleuropäische Normalzeit)~~Admin_SA, SharePoint (i:0#.w|xespsa)~~15-Indirekter Einkauf~~15-Indirekter Einkauf~~Comment 2~~'.split('~~')

console.log(str[str.length - 2]) // Comment 2

str[str.length - 2] = "Comment 3"; 

let concat = str.join('~~');
console.log(concat);

您可以使用正则表达式:/(?<=~~)[^~]+(?=~~$)/gm

这会在由两个波浪号包裹的行末尾的单词创建后视和前视 ~~

(如果您想要整个字符串中的最后一个而不是行中的最后一个,请删除末尾的 gm

const regex = /(?<=~~)[^~]+(?=~~$)/gm;

const str = `
log: Mon Jan 24 2022 09:28:10 GMT+0100 (Mitteleuropäische Normalzeit)~~Admin_SA, SharePoint (i:0#.w|xespsa)~~00-Entwurf~~15-Indirekter Einkauf~~~~
Mon Jan 24 2022 09:28:20 GMT+0100 (Mitteleuropäische Normalzeit)~~Admin_SA, SharePoint (i:0#.w|xespsa)~~00-Entwurf~~15-Indirekter Einkauf~~~~
Tue Jan 25 2022 20:51:17 GMT+0100 (Mitteleuropäische Normalzeit)~~Admin_SA, SharePoint (i:0#.w|xespsa)~~15-Indirekter Einkauf~~15-Indirekter Einkauf~~Comment 1~~
Tue Jan 25 2022 20:58:34 GMT+0100 (Mitteleuropäische Normalzeit)~~Admin_SA, SharePoint (i:0#.w|xespsa)~~15-Indirekter Einkauf~~15-Indirekter Einkauf~~Comment 2~~
`;

console.log(str.match(regex))
console.log(str.replace(regex, 'replacement'))


当然,您甚至可以根据选择来选择替换:

str.replace(regex, selection => selection == 'Comment 2' ? 'Comment 3' : 'Comment 4')

用递增数字的情况扩展这个(如果你需要的话):

str.replace(regex, selection => selection.replace(/\d+/, n => +n+1))

你可以用正则表达式替换。

const
    string = 'Mon Jan 24 2022 09:28:10 GMT+0100 (Mitteleuropäische Normalzeit)~~Admin_SA, SharePoint (i:0#.w|xespsa)~~00-Entwurf~~15-Indirekter Einkauf~~~~\nMon Jan 24 2022 09:28:20 GMT+0100 (Mitteleuropäische Normalzeit)~~Admin_SA, SharePoint (i:0#.w|xespsa)~~00-Entwurf~~15-Indirekter Einkauf~~~~\nTue Jan 25 2022 20:51:17 GMT+0100 (Mitteleuropäische Normalzeit)~~Admin_SA, SharePoint (i:0#.w|xespsa)~~15-Indirekter Einkauf~~15-Indirekter Einkauf~~Comment 1~~\nTue Jan 25 2022 20:58:34 GMT+0100 (Mitteleuropäische Normalzeit)~~Admin_SA, SharePoint (i:0#.w|xespsa)~~15-Indirekter Einkauf~~15-Indirekter Einkauf~~Comment 2~~',
    result = string.replace(/(?<=~~)[^~]+(?=~~$)/gm, 'Comment3');

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

为了简单起见,您可以尝试:

str.replace(/~~Comment 2~~$/, "~~Comment 3~~");