Ricerca nel sito web

javascript - Possiamo usare le regex per risolvere più regole contemporaneamente?


Ho bisogno di prevenire alcune interazioni degli utenti e la prima cosa che mi viene in mente è regex immediatamente.

Per prima cosa scriverò nel miglior modo possibile ciò che devo realizzare e poi pubblicherò il codice che ho scritto per realizzare la maggior parte di queste cose, ma ancora non è perfetto...

  • Prendi la corda
  • Non permettere che inizi a digitare con uno spazio
  • Non consentire più spazi consecutivi
  • Non consentire più punti consecutivi
  • Non consentire più apostrofi
  • Consentire i seguenti caratteri [a-z] '.
  • Non consentire alla stringa di superare 14 caratteri

Ora, ecco il mio codice:

this.name = this.name
  .replace(/^[\s]+/, '')     // prevent starting with space
  .replace(/\s\s+/, ' ')     // prevent multiplace spaces
  .replace(/\.\./, '.')      // prevent multiple dots
  .replace(/''/, '\'')       // prevent multiple apostrophies
  .replace(/[^ a-z'.]/i, '') // allowed
  .toUpperCase()             // transform
  .substring(0, 14)          // do not allow more than 14 characters

Domande:

  • Possiamo e come, se sì, realizzare tutte o la maggior parte di queste regole regex in una singola sostituzione?

  • Come posso correggere/migliorare le mie regole regex per non permettere più di un singolo .? Ho fatto in modo che non permetta inserimenti continui, ma un utente può usare due punti come M.G.K - anche se voglio permettere solo un singolo inserimento di . nell'intera stringa?

  • Come sopra, ma per ' (apostrofo)?

Risposta n. 1

Il primo requisito per "inserire tutto" in un'unica operazione di sostituzione regex è piuttosto facile da implementare, perché tutte le sostituzioni che devi fare utilizzano i caratteri che corrispondono. Puoi usare .replace(/^\s+|(&\s)\s+|(&\.)\.|(')'|[^a-z'.]+/ig, '$1$2$3'), vedi questo esempio di regex.

Dettagli

  • ^\s+ - inizio della stringa (^) e poi 1 o più spazi bianchi
  • | - o
  • (\s)\s+ - uno spazio singolo catturato nel Gruppo 1 e poi 1 o più caratteri di spazio
  • | - o
  • (\.)\. - un . catturato nel Gruppo 2, e poi un .
  • | - o
  • (')' - un ' catturato nel Gruppo 3 e poi un '
  • | - o
  • [^a-z'.]+ - 1 o più caratteri diversi da uno spazio, una lettera ASCII, ' e ..

Il modificatore /i fa sì che a-z venga abbinato in modo insensibile alle maiuscole, g abilita più corrispondenze. Il $1 si riferisce al valore del Gruppo 1, $2 fa riferimento al valore del Gruppo 2 e il $3 si riferisce al valore del Gruppo 3. Nota che se non sono abbinati, questi valori nei gruppi sono stringhe vuote, quindi possiamo usare tre di essi insieme in un singolo modello di sostituzione delle stringhe.

Il secondo e il terzo requisito richiedono altre due operazioni separate di sostituzione con regex. L'obiettivo è quello di abbinare e catturare tutti i caratteri fino alla seconda occorrenza di ' e . e semplicemente abbinare la seconda occorrenza di ' e ., e poi sostituirla con il riferimento inverso al primo gruppo: 1) .replace(/^([^']*'[^']*)'/, '$1') (demo) e 2) .replace(/^([^.]*\.[^.]*)\./, '$1') (demo).

Dettagli

  • ^ - ancòra di inizio stringa
  • ([^']*'[^']*) - Gruppo 1:

    • [^']* - qualsiasi sequenza di 0 o più caratteri diversa da ' (una [^...] è una classe di caratteri negata che corrisponde a qualsiasi carattere diverso da quelli definiti all'interno della classe)
    • ' - un apostrofo
    • [^']* - qualsiasi sequenza di 0 o più caratteri diversa da '
  • ' - un apostrofo.

Questa corrispondenza viene sostituita con $1, il contenuto del primo gruppo di cattura.

Il terzo schema è analogo al secondo schema, solo che ' è sostituito con ./\. (nota che all'interno di una classe di caratteri, un . è trattato come un . letterale, non corrisponde a nessun carattere tranne i caratteri di interruzione di riga all'interno di [...]).