Espressione regolare per consentire spazi tra le parole


191

Voglio un'espressione regolare che prevenga i simboli e consenta solo lettere e numeri. La regex di seguito funziona alla grande, ma non consente spazi tra le parole.

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

Ad esempio, quando si utilizza questa espressione regolare "HelloWorld" va bene, ma "Hello World" non corrisponde.

Come posso modificarlo per consentire gli spazi?

Risposte:


372

tl; dr

Aggiungi uno spazio nella tua classe di personaggi .

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

 


Ora, se vuoi essere severo ...

Quanto sopra non è esattamente corretto. A causa del fatto che *significa zero o più , corrisponderebbe a tutti i seguenti casi che di solito non significherebbe corrispondere:

  • Una stringa vuota "".
  • Una stringa composta interamente da spazi "".
  • Una stringa che conduce e / o trascina con spazi, "Hello World".
  • Una stringa che contiene più spazi tra le parole, "Hello World".

Inizialmente non pensavo che valesse la pena approfondire tali dettagli, poiché OP stava ponendo una domanda così fondamentale che sembrava che la rigidità non fosse un problema. Ora che la domanda ha guadagnato un po 'di popolarità, voglio dire ...

... usa la risposta di @ stema .

Che, nel mio sapore (senza usare \w) si traduce in:

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

(Si prega di votare @stema a prescindere.)

Alcune cose da notare su questa risposta (e @ stema):

  • Se si desidera consentire più spazi tra le parole (ad esempio, se si desidera consentire doppi spazi accidentali o se si sta lavorando con testo incollato da un PDF), quindi aggiungere un +dopo lo spazio:

    ^\w+( +\w+)*$
  • Se si desidera consentire le schede e le nuove righe (caratteri di spazi bianchi), sostituire lo spazio con un \s+:

    ^\w+(\s+\w+)*$

    Qui ti suggerisco +di default perché, ad esempio, le interruzioni di riga di Windows sono costituite da due caratteri di spazi bianchi in sequenza \r\n, quindi dovrai +prenderli entrambi.

Continua a non funzionare?

Controlla quale dialetto delle espressioni regolari stai utilizzando. * In lingue come Java dovrai sfuggire alle tue barre rovesciate, cioè \\w e \\s. In linguaggi e le utility più anziani o più di base, come sed, \we \snon sono definiti, in modo da scrivere con classi di personaggi, per esempio [a-zA-Z0-9_] e [\f\n\p\r\t], rispettivamente.

 


* So che questa domanda è taggata, ma sulla base di oltre 25.000 visualizzazioni, suppongo che non siano solo quelle persone a trovare questa domanda. Attualmente è il primo hit su Google per la frase di ricerca, parola spazio espressione regolare .


3
consente la stringa vuota
Neha Choudhary,

1
Wow, così semplice! Grazie. Non esiste un sito o qualcosa che si possa usare per generare espressioni regex, per noob intendo ...
Pierre,

1
@Pierre - È abbastanza difficile prendere istruzioni umane e convertirle in regole esplicite. (Il linguaggio umano è fluido e pieno di ambiguità, e il nostro cervello fa la maggior parte del lavoro necessario per risolvere le cose e colmare le lacune. I computer non hanno un tale cervello e i tentativi intelligenti di imitarne uno non sono ancora abbastanza potenti. ) Esistono strumenti come debuggex.com che rappresentano visivamente la tua regex, ma per quanto attraente possa non essere molto utile per i principianti completi. Consiglio comunque un tutorial interattivo per chiarire le basi.
Andrew Cheong,

1
Sì, anche la tua regex corrisponderà se ci sono solo spazi. La mia risposta è stata al commento di Neha Choudary.
Rajshekar Reddy,

1
@Pierre Tre anni dopo - ho incontrato questa domanda oggi, ho visto il tuo commento; Uso regex hero ( regexhero.net ) per testare espressioni regolari. Penso che la versione online funzioni solo in Internet Explorer con Silverlight ma è meglio di niente.
Michael Armes,

122

Una possibilità sarebbe quella di aggiungere semplicemente lo spazio nella tua classe di caratteri, come suggerito acheong87, questo dipende da quanto sei rigoroso nel tuo schema, perché ciò consentirebbe anche una stringa che inizia con 5 spazi o stringhe costituite solo da spazi.

L'altra possibilità è definire un modello:

Userò \wquesto nella maggior parte dei sapori regex lo stesso di [a-zA-Z0-9_](in alcuni è basato su Unicode)

^\w+( \w+)*$

Ciò consentirà una serie di almeno una parola e le parole sono divise per spazi.

^ Abbina l'inizio della stringa

\w+ Abbina una serie di almeno un carattere di parola

( \w+)*è un gruppo che viene ripetuto 0 o più volte. Nel gruppo si aspetta uno spazio seguito da una serie di almeno un carattere di parola

$ corrisponde alla fine della stringa


Questo: regex101.com/#javascript fornisce anche una buona spiegazione per il modello regex che si desidera analizzare.
Dark Star1,

Nice Regex, molto più semplice di molti [0-9a-z] ecc.
George

Ho trovato nel mio interprete regex che avevo bisogno di avvolgere l'intera stringa tra parentesi in modo che la prima corrispondenza fosse l'intera stringa e non solo le parole che seguono il primo spazio. Questo ha ^- (\w+( \w+)*)$funzionato per me.
NoseKnowsTutte


12

Prova con:

^(\w+ ?)*$

Spiegazione:

\w             - alias for [a-zA-Z_0-9]
"whitespace"?  - allow whitespace after word, set is as optional

2
Questo indurrà così l'inferno a tornare indietro.
nhahtdh,

1
Ad esempio, data una stringa non corrispondente ggggggggggggggggggggggggggggggggggggg;, il regex impiegherà molto tempo a raggiungere il risultato a causa di un eccessivo backtracking.
nhahtdh,

Ok, allora cosa mi consigliate?
hsz,

7

Presumo che tu non voglia spazio iniziale / finale. Questo significa che devi dividere la regex in "primo personaggio", "roba nel mezzo" e "ultimo carattere":

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

o se usi una sintassi simile al perl:

^\w[\w ]*\w$

Inoltre: se hai formulato intenzionalmente il tuo regex che consente anche stringhe vuote, devi rendere tutto opzionale:

^(\w[\w ]*\w)?$

Se vuoi consentire solo singoli caratteri spaziali, sembra un po 'diverso:

^((\w+ )*\w+)?$

Questo corrisponde a 0..n parole seguite da un singolo spazio, più una parola senza spazio. E rende tutto opzionale per consentire stringhe vuote.


Spazio e \snon sono equivalenti. \scorrisponde più di un semplice spazio.
nhahtdh,

@nhahtdh: grazie per il commento. Sono troppo abituato ad abbinare gli spazi in generale, credo. La risposta è fissa.
creinig

È possibile che manchi una parentesi chiusa nella prima espressione? Non sono sicuro di non averlo provato.
ssinfod

@ssinfod: buona cattura. In realtà in questo esempio la parentesi di apertura è superflua. Grazie.
creinig

4

Questa espressione regolare

^\w+(\s\w+)*$

consentirà solo un singolo spazio tra le parole e nessuno spazio iniziale o finale.

Di seguito è la spiegazione dell'espressione regolare:

  1. ^ Asserire la posizione all'inizio della stringa
  2. \w+ Abbina qualsiasi carattere di parola [a-zA-Z0-9_]
    1. Quantificatore: +tra una e infinite volte, quante più volte possibile, restituendo quanto necessario [goloso]
  3. 1 ° gruppo di cattura (\s\w+)*
    1. Quantificatore: *tra zero e tempi illimitati, quante più volte possibile, restituendo quanto necessario [goloso]
    2. \s Abbina qualsiasi carattere di spazio bianco [\r\n\t\f ]
    3. \w+ Abbina qualsiasi carattere di parola [a-zA-Z0-9_]
      1. Quantificatore: +tra una e infinite volte, quante più volte possibile, restituendo quanto necessario [goloso]
  4. $ Asserire la posizione alla fine della stringa

2

Ciò non consente lo spazio all'inizio. Ma consente spazi tra le parole. Consente anche caratteri speciali tra le parole. Una buona regex per i campi FirstName e LastName.

\w+.*$

Questa risposta è errata / inaccurata. Questo modello corrisponde a uno o più caratteri alfanumerici, trattini bassi, quindi zero o più di qualsiasi carattere non newline. Non va bene per l'OP.
Mickmackusa,

2

Solo per alfabeti:

^([a-zA-Z])+(\s)+[a-zA-Z]+$

Per valore alfanumerico e _:

^(\w)+(\s)+\w+$

1
non è un buon esempio, perché (qualcosa) + non è lo stesso di (qualcosa +). Nel primo esempio, solo un singolo personaggio verrà catturato come $ 1.
Znik,

0

Prova questo: (versione Python)

"(A-Za-z0-9 ){2, 25}"

modificare il limite superiore in base al set di dati


0

Aggiungi uno spazio alla fine del tuo pattern regex come segue:

[a-zA-Z0-9_ ]

-1

Ho dato una buona occhiata a molte di queste presunte risposte ...

... e bupki dopo aver setacciato Stack Overflow così come altri siti per una regex che corrisponde a qualsiasi stringa senza spazi bianchi iniziali o finali e solo un singolo spazio tra parole di carattere strettamente alfa.

^[a-zA-Z]+[(?<=\d\s]([a-zA-Z]+\s)*[a-zA-Z]+$

Così facilmente modificabile in alfanumerico:

^[a-zA-Z0-9]+[(?<=\d\s]([a-zA-Z0-9]+\s)*[a-zA-Z0-9]+$

(Questo non corrisponde a parole singole, ma usa semplicemente un interruttore / if-else con un semplice ^[a-zA-Z0-9]+$se hai bisogno di catturare anche parole singole.)

godere: D


3
[(?<=\d\s]partite di un carattere: (, ?, <, =, una cifra o uno spazio bianco, e che non può essere quello che volevi dire. Se doveva essere uno sguardo dietro, dovrebbe esserlo (?<=\d\s), ma non ha senso lì; la regex non corrisponderebbe mai.
Alan Moore,

Ai votanti: si prega di non votare soluzioni sbagliate. Confondono gli altri utenti e li fanno credere che regex possa fare cose che non fanno.
Wiktor Stribiżew,

-1

Trovo che questo funzioni bene per un "FullName":

([a-z',.-]+( [a-z',.-]+)*){1,70}/

-4

provare .*? per consentire spazi bianchi ha funzionato per me


Questo perché .corrisponde a tutto. È molto probabile che questa non sia la soluzione qui.
rubik,

corrisponde a zero o qualsiasi carattere, dipende da ciò che è prima e dopo questa sequenza. questo corrisponderà il minor numero possibile. punto singolo rappresenta qualsiasi carattere singolo.
Znik,
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.