这个正则表达式会起作用吗?我正在尝试匹配并提取许多不同的缩写



我正在尝试匹配一组缩写,这些缩写需要在数据点列表中提取或更改。我相信我有一个可行的解决方案,但我很想听听更有经验的regex用户的想法。代码将使用JavaScript编写。谢谢你的帮助!

b([CMKLPR]|PW|CCR|CS|CW|FG|G|Int|Jct|NOBO|NTH|P|PH|PO|PT|RG|Rx|SF|SOBO|SP|SR|TH|W|WMA|WMD)b

缩写示例(还有更多(

C露营

CCW逆时针

CG营地(费用和饮用水,除非另有说明(

CR县道

CS便利店

CW顺时针

FG炉排或格栅

p停车

G杂货店

这就是数据点字符串的样子

自行车/人行天桥旁的John Stretch公园。PW,R、 PT,第P天,PH.不露营。

编辑帮助澄清我要做的事情。。。。

我需要更改这个:

{
"Description": "Jct with 0.1-mile blue-blaze to Three Lakes Camp. C, RG, PT, W from pump.",
}

类似的东西:

{
"Description": "Jct with 0.1-mile blue-blaze to Three Lakes Camp.",
"Amenities": [
{
"Title": "Camping",
"Icon": "camping.png"
},
{
"Title": "Register",
"Icon": "register.png"
},
{
"Title": "Picnic Table",
"Icon": "picnic.png"
},
{
"Title": "Water",
"Icon": "water.png"
}
]
}

这样一个正则表达式的想法很好。您可以基于具有定义映射的键/值对的对象来动态构建表达式。然后使用replace的回调参数来查找相关的替换字符串。

let map = {
C: "Camping",
CCW: "Counter-clockwise",
CG: "Campground (fee & potable water, unless otherwise indicated)",
CR: "County Road",
CS: "Convenience Store",
CW: "Clockwise",
FG: "Fire grate or grill",
P: "Parking",
G: "Grocery",
};
let regex = RegExp("\b(" + Object.keys(map).join("|") + ")\b", "g");
let input = "G, P, FG, and CS, on this C.";
let result = input.replace(regex, m => map[m]);
console.log(result);

注意:如果缩写在正则表达式中有任何具有特殊含义的字符,请确保在mapper对象中正确转义这些字符,或者使用类似于此处的动态解决方案。

如果映射是一个常数,并且输入不同,那么可以为给定的映射创建一个特定的函数,然后将其用于处理不同的输入。我在这里还包括逃生:

function createReplacer(map) {
let escaper = str => str.replace(/[-/\^$*+?.()|[]{}]/g, '\$&');
let regex = RegExp("\b(" + Object.keys(map).map(escaper).join("|") + ")\b", "g");
return str => str.replace(regex, m => map[m]);
}
// demo
let replacer = createReplacer({
C: "Camping",
CCW: "Counter-clockwise",
CG: "Campground (fee & potable water, unless otherwise indicated)",
CR: "County Road",
CS: "Convenience Store",
CW: "Clockwise",
FG: "Fire grate or grill",
P: "Parking",
G: "Grocery",
"A-F": "A-frame tents",
});
let input = "G, P, FG, and CS, on this C. A-F allowed";
console.log(replacer(input));

Ciao,您可以使用RegExp.exec在字符串中查找子字符串,并将其替换为另一个与正则表达式不匹配的字符串。类似:

let str = "John Stretch Park at bicycle/pedestrian bridge. PW, R, PT, Day P, PH. NO CAMPING.";
var re  = new RegExp(/b([CMKLPR]|PW|CCR|CS|CW|FG|G|Int|Jct|NOBO|NTH|P|PH|PO|PT|RG|Rx|SF|SOBO|SP|SR|TH|W|WMA|WMD)b/g);
let result = re.exec(str)
while(result !== null)
{
console.log(result[0])
str = str.replace(result[0], "_") // replace with something
result = re.exec(str)
}

最新更新