我有以下字符串:
[
'全新Precision 5530二合一移动工作站',
'15" (5530)',
'新14"灵越燃7000三边微边框',
'灵越新13"(7380)轻薄本 热卖',
'XPS新15"(9570)热卖',
'新15"灵越5000(Intel)',
'12” 二合一 (5290)'
]
我需要消除所有非中文字符(例如产品线名称,型号),包括括号内的字符,但是我也不能替换(英特尔)(可以是括号内的其他字符串,但不能参加正则表达式比赛)
现在,我有以下内容:pattern = /(\w+\s+\d+|\(?\d{4}\)?|[a-z]+)/gi
应用于上一个数组的this返回
[
["Precision 5530"],
["(5530)"],
["7000"],
["(7380)"],
["XPS", "(9570)"],
["5000", "Intel"],
["(5290)"]
]
这几乎是完美的,除了“英特尔”不应该在那儿。我似乎无法使用排除英特尔(或()中常见字母的任何东西)的正则表达式
在regex101上:https://regex101.com/r/vqO0BO/2
有人可以帮忙吗?
解决方案: 通过答案中提供的正则表达式(还要获取括号)和一些js,我设法从想要的文本中获取newText。
newText = text.replace(pattern, function(a, b) {
if(a === b) {
return " ";
} else {
if(a !== undefined) {
return a;
} else if(b !== undefined) {
return b;
} else { //If a and b are undefined, just replace the "undefined" with ""
return "";
}
}
}).trim();
答案 0 :(得分:1)
我建议匹配括号内的内容,并匹配并捕获其余内容。捕获组匹配某些文本后,可以用空格替换匹配项,如果第1组不匹配,则用整个匹配项替换。
var strs = [
'全新Precision 5530二合一移动工作站',
'15" (5530)',
'新14"灵越燃7000三边微边框',
'灵越新13"(7380)轻薄本 热卖',
'XPS新15"(9570)热卖',
'新15"灵越5000(Intel)',
'12” 二合一 (5290)'
];
var pattern = /\([a-z]+\)|(\w+\s+\d+|\(?\d{4}\)?|[a-z]+)/gi;
for (var s of strs) {
console.log(
s.replace(pattern, function (a, b) {
return b ? " " : a;
}).trim()
);
}
正则表达式详细信息
\(
-(
[a-z]+
-1个以上字母\)
-一个)
|
-或(\w+\s+\d+|\(?\d{4}\)?|[a-z]+)
-第1组:1个以上的字符字符,1个以上的空格和1个以上的数字,或可选的(
,4个数字和可选的)
或1个或多个ASCII字母。