Questa Regex funzionerà? Sto cercando di abbinare ed estrarre molte abbreviazioni diverse [duplicato]

Aug 23 2020

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

1 trincot Aug 23 2020 at 21:23

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 replaceper 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));

GiovanniEsposito Aug 23 2020 at 21:31

Ciao, potresti usare RegExp.execper 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)
}