Questa Regex funzionerà? Sto cercando di abbinare ed estrarre molte abbreviazioni diverse [duplicato]
Sto cercando di abbinare un gruppo di abbreviazioni che avrò bisogno di estrarre o modificare in un elenco di punti dati. Credo di avere una soluzione funzionante, ma mi piacerebbe sentire i pensieri degli utenti regex più esperti. Il codice sarà scritto in JavaScript. Grazie per l'aiuto!
\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
Esempio delle abbreviazioni (ce ne sono altre)
C Campeggio
CCW Senso antiorario
CG Campground (a pagamento e acqua potabile, se non diversamente indicato)
Strada provinciale CR
Minimarket CS
CW in senso orario
FG Braciere o grill
P Parcheggio
Drogheria G
Questo è l'aspetto delle stringhe di punti dati
John Stretch Park al ponte ciclabile/pedonale. PW, R, PT, Giorno P, PH. DIVIETO DI CAMPEGGIO.
Modifica Per aiutare a chiarire cosa sto cercando di fare ....
devo cambiare questo:
{
"Description": "Jct with 0.1-mile blue-blaze to Three Lakes Camp. C, RG, PT, W from pump.",
}
A qualcosa del genere:
{
"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"
}
]
}
Risposte
L'idea di un'espressione così regolare va bene. È possibile creare l'espressione in modo dinamico, in base a un oggetto con coppie chiave/valore che definiscono la mappatura. Quindi utilizzare l'argomento di callback di replace
per trovare la stringa di sostituzione pertinente.
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);
Nota: se le abbreviazioni hanno caratteri che hanno un significato speciale in un'espressione regolare, assicurati di eseguire correttamente l'escape di tali caratteri nell'oggetto mapper o utilizza una soluzione dinamica come qui .
Se la mappatura è una costante e l'input varia, è possibile creare una funzione specifica per una data mappatura e quindi utilizzarla per elaborare input diversi. Includo qui anche l'escape:
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, potresti usare RegExp.exec
per trovare una sottostringa nella tua stringa e sostituirla con un'altra stringa che non corrisponde alla tua regex. Piace:
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)
}