如何使用 JavaScript 正则表达式从字符串中删除字符

5

我有一个字符串值,它看起来像以下示例:

data:


130823  ~ Optics-Bottle Detect failure ~ L 0 ~ P 0 | 130824 ~ Optics-Bubble Detect failure ~ L 0 ~ P 0

Format:

ID:          130823
Description: Optics-Bottle Detect failure 
Reps:        L O
Pending:     P 0

我的最终字符串基本上应该从连接字符串的每个部分中删除ID,因此通过查看上面的样本数据,期望输出应如下所示:

 Optics-Bottle Detect failure ~ L 0 ~ P 0 | Optics-Bubble Detect failure ~ L 0 ~ P 0 

一个字符串中可能包含N个部分。为了举例,我只列出了一个包含两个部分的示例字符串。

**我的正则表达式

我使用以下正则表达式,但它只能从字符串的第一个部分中删除ID。

var y = x.replace(/\d{6}\s~\s/g, "");

2
这对我来说从上面的字符串中删除了两个ID。 - Nick Tomlin
这将同时移除:http://jsfiddle.net/6KkGK/ - nnnnnn
这对我有效:http://jsfiddle.net/bbsss/ - gen_Eric
@RocketHazmat 我更正了我的示例数据字符串。之前有问题。使用这个示例数据,它将不会返回正确结果。 - tam tam
@nnnnnn 我已经更正了我的示例数据字符串。之前出了些问题。使用这个示例数据,它将不会正确返回。 - tam tam
130823 ~ 该数字后面有2个空格,而不是1个。 - gen_Eric
2个回答

4

以下是一个可能的答案,例如:

var str = "144515 ~ Commodities-Damaged Reagent Cartridge ~ L 0 ~ P 0 | 144516 ~ Commodities";
var n=/\d{6}\s+~/g;
str = str.replace(n, "");

1
这不会移除 ~ - gilly3

1
将字符串使用分隔符" | "" ~ "拆分为多维数组。然后您可以使用.shift()删除id,因为它是数组中的第一个条目,并将其全部重新连接在一起:
var y = x.split(" | ").map(function(s) {
    s = s.split(" ~ ");
    s.shift();
    return s.join(" ~ ");
}).join(" | ");

或者,获取 "~" 后的子字符串:
var y = x.split(" | ").map(function(s) {
    return s.substr(s.indexOf(" ~ ") + 3);
}).join(" | ");

或者,修改您的正则表达式以考虑空格长度变化:
var y = x.replace(/\d{6}\s+~\s/g, "");

然而,这个正则表达式只在id中恰好有6个数字,并且从未有6个数字在其他地方的~之前时才能起作用。例如,如果Reps的值为100000或更大,则您的正则表达式也会将其删除。

更好的正则表达式应该接受任意数量的数字(多于或少于6个),并且只有在它是第一个项目或者跟随一个|时才匹配:

var y = x.replace(/(^|\|\s+)\d+\s+~\s+/g, "$1");

ID可能会超过6位数字,因为它是行的标识列值。我应该只使用您在上面答案中列出的第一个函数吗? - tam tam
是的,如果每个条目中id总是排在第一位,那么前两种解决方案都会更好。如果您更喜欢正则表达式选项,我也会更新我的答案,提供更健壮的正则表达式选项。 - gilly3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接