Espressione regolare per lettere, numeri e - _


100

Ho problemi a controllare in PHP se un valore è una delle seguenti combinazioni

  • lettere (maiuscole o minuscole)
  • numeri (0-9)
  • trattino basso (_)
  • trattino (-)
  • punto (.)
  • no spazi! o altri personaggi

alcuni esempi:

  • OK: "screen123.css"
  • OK: "screen-new-file.css"
  • OK: "screen_new.js"
  • NON OK: "screen new file.css"

Immagino di aver bisogno di una regex per questo, poiché ho bisogno di lanciare un errore quando una stringa di data contiene altri caratteri rispetto a quelli sopra menzionati.


^ [\ w .-] * $ -> Questo otterrà il nome del file all.
Badri Gs

Risposte:


207

Lo schema che desideri è qualcosa del tipo ( guardalo su rubular.com ):

^[a-zA-Z0-9_.-]*$

Spiegazione:

  • ^ è l'inizio della linea di ancoraggio
  • $ è la fine della linea di ancoraggio
  • [...] è una definizione di classe di caratteri
  • * è la ripetizione "zero o più"

Si noti che il trattino letterale -è l'ultimo carattere nella definizione della classe di caratteri, altrimenti ha un significato diverso (cioè intervallo). L' .ha anche un diverso significato definizioni di classe al di fuori carattere, ma dentro, è solo un letterale.

Riferimenti


In PHP

Ecco uno snippet per mostrare come puoi usare questo pattern:

<?php

$arr = array(
  'screen123.css',
  'screen-new-file.css',
  'screen_new.js',
  'screen new file.css'
);

foreach ($arr as $s) {
  if (preg_match('/^[\w.-]*$/', $s)) {
    print "$s is a match\n";
  } else {
    print "$s is NO match!!!\n";
  };
}

?>

Le stampe sopra ( come visto su ideone.com ):

screen123.css is a match
screen-new-file.css is a match
screen_new.js is a match
screen new file.css is NO match!!!

Nota che il modello è leggermente diverso, usando \winvece. Questa è la classe di caratteri per "carattere parola".

Riferimenti API


Nota sulle specifiche

Questo sembra seguire le tue specifiche, ma nota che corrisponderà a cose come ....., ecc., Che possono o meno essere ciò che desideri. Se puoi essere più specifico con quale modello vuoi abbinare, la regex sarà leggermente più complicata.

La regex sopra corrisponde anche alla stringa vuota. Se hai bisogno di almeno un carattere, usa +(uno o più) invece di *(zero o più) per la ripetizione.

In ogni caso, puoi chiarire ulteriormente le tue specifiche (aiuta sempre quando chiedi una domanda regex), ma si spera che tu possa anche imparare a scrivere il pattern da solo, date le informazioni di cui sopra.


Vedi anche ideone.com/5DMCa per una specifica diversa che potrebbe essere più di quello che desideri. Vai avanti e indietro con me su Rubular se vuoi sviluppare le specifiche con me.
lubrificanti poligenici il

Sto usando Tornado e ho bisogno di catturare i nomi html, quindi l'ho usato in base alla tua risposta; ^/([a-zA-Z0-9._-]*\.html)$
NuclearPeon

Aggiungerei un'altra regola che è: l' ultimo carattere dovrebbe essere un alfanumerico. Regex aggiornata:/[a-zA-Z0-9]+(\.[a-zA-Z0-9]+){2,}[a-zA-Z0-9^]$/
Consta Gorgan

Utenti Go (golang), avvertite, il pattern qui risulterà in falsevalori letterali di stringa grezza vuoti. Parco giochi . Usa la soluzione di @ nonopolarity di seguito .
BentCoder,

15

Puoi usare

^[\w\d_.-]+$

il +è quello di assicurarsi che ha almeno 1 carattere. È necessario ^e $per denotare l'inizio e la fine, altrimenti se la stringa ha una corrispondenza nel mezzo, ad esempio @@@@xyz%%%%è ancora una corrispondenza.


3
Metti il -primo nel set, per evitare di definire un intervallo. E \wcopre caratteri alfanumerici e trattini bassi. Quindi hai bisogno [\w.-]+.
Richard,

Grazie, per me funziona bene: ^ [\ w \ d _.-] + \. (Csv | CSV) $
Dharam Mali

Questo è conforme anche ai valori letterali di stringa grezza vuoti di Go (golang) mentre la risposta accettata non lo fa, quindi gli utenti di Go si attengono a questa soluzione. Parco giochi
BentCoder

8

Per coprire effettivamente il tuo modello, cioè nomi di file validi secondo le tue regole, penso che tu abbia bisogno di un po 'di più. Nota che questo non corrisponde ai nomi di file legali da una prospettiva di sistema . Sarebbe dipendente dal sistema e più liberale in ciò che accetta. Questo ha lo scopo di abbinare i tuoi modelli accettabili.

^([a-zA-Z0-9]+[_-])*[a-zA-Z0-9]+\.[a-zA-Z0-9]+$

Spiegazione:

  • ^Trova la corrispondenza con l'inizio di una stringa. Questo (più la corrispondenza finale) forza la stringa a conformarsi all'espressione esatta, non a contenere semplicemente una sottostringa che corrisponde all'espressione.
  • ([a-zA-Z0-9]+[_-])*Zero o più occorrenze di una o più lettere o numeri seguiti da un trattino basso o un trattino. Ciò fa sì che tutti i nomi che contengono un trattino o un trattino basso abbiano lettere o numeri tra di loro.
  • [a-zA-Z0-9]+Una o più lettere o numeri. Questo copre tutti i nomi che non contengono un trattino basso o un trattino.
  • \.Un punto letterale (punto). Impone che il nome del file abbia un'estensione e, escludendo il resto del pattern, consente solo l'utilizzo del punto tra il nome e l'estensione. Se vuoi più di un'estensione che possa essere gestita anche usando la stessa tecnica del trattino / trattino basso, solo alla fine.
  • [a-zA-Z0-9]+Una o più lettere o numeri. L'estensione deve essere lunga almeno un carattere e deve contenere solo lettere e numeri. Questo è tipico, ma se vuoi consentire i trattini bassi, anche quello potrebbe essere risolto. Potresti anche fornire un intervallo di lunghezza {2,3}invece di uno o più +abbinamenti, se fosse più appropriato.
  • $Trova la corrispondenza della fine della stringa. Vedi il personaggio iniziale.

6

Questo è il modello che stai cercando

/^[\w-_.]*$/

Cosa significa:

  • ^ Inizio della stringa
  • [...] Abbina i caratteri all'interno
  • \w Qualsiasi carattere della parola così 0-9 a-z A-Z
  • -_.Abbina -e _e.
  • * Zero o più pattern o illimitato
  • $ Fine della stringa

Se vuoi limitare il numero di caratteri:

/^[\w-_.]{0,5}$/

{0,5}Significa 0-5caratteri


var a = / ^ \ w * $ / g a.test ("46545") e il risultato era falso
Dipak

1
Si noti che \winclude_
hxpax

4

Qualcosa di simile dovrebbe funzionare

$code = "screen new file.css";
if (!preg_match("/^[-_a-zA-Z0-9.]+$/", $code))
{
    echo "not valid";
}

Questo mostrerà "non valido"


2

[A-Za-z0-9_.-]*

Ciò corrisponderà anche alle stringhe vuote, se non si desidera sostituire l'ultima *con un file+

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.