2013-03-25 14 views

risposta

55

Il primo corrisponde a un singolo spazio bianco, mentre la seconda corrisponde a uno o molti spazi bianchi. Sono i cosiddetti quantificatori espressioni regolari, e svolgono le partite di questo tipo (presi dal documentation):

Greedy quantifiers 
X? X, once or not at all 
X* X, zero or more times 
X+ X, one or more times 
X{n} X, exactly n times 
X{n,} X, at least n times 
X{n,m} X, at least n but not more than m times 

Reluctant quantifiers 
X?? X, once or not at all 
X*? X, zero or more times 
X+? X, one or more times 
X{n}? X, exactly n times 
X{n,}? X, at least n times 
X{n,m}? X, at least n but not more than m times 

Possessive quantifiers 
X?+ X, once or not at all 
X*+ X, zero or more times 
X++ X, one or more times 
X{n}+ X, exactly n times 
X{n,}+ X, at least n times 
X{n,m}+ X, at least n but not more than m times 
+8

Ho sempre amato come forniscono descrizioni separate delle versioni avide, riluttanti e possessive di ogni quantificatore, e poi dicono esattamente la stessa cosa su tutti e tre. ;) –

2

La prima espressione regolare corrisponderà un carattere di spaziatura. La seconda regex corrisponderà con riluttanza a uno o più caratteri di spaziatura. Per la maggior parte degli scopi, queste due regex sono molto simili, tranne nel secondo caso, la regex può corrispondere a più della stringa, se impedisce che la corrispondenza delle espressioni regolari non vada a buon fine. da http://www.coderanch.com/t/570917/java/java/regex-difference

+0

Scratch la parola "a malincuore". Questa domanda riguarda '\ s +', non '\ s +?' Come quell'altra domanda. –

30

Queste due chiamate replaceAll generano sempre lo stesso risultato, indipendentemente da ciò che è x. Tuttavia, è importante notare che le due espressioni regolari non sono la stessa cosa:

  • \\s - corrisponde a carattere singolo di spaziatura
  • \\s+ - corrisponde sequenza di uno o più caratteri di spaziatura.

In questo caso, non fa differenza, dal momento che si sta sostituendo tutto con una stringa vuota (anche se sarebbe meglio usare \\s+ dal punto di vista dell'efficienza). Se stavi sostituendo con una stringa non vuota, i due si comporterebbero in modo diverso.

+0

W.r.t la tua prima riga, se x è "Prenota il tuo dominio e ottieni \ n \ n \ n \ n \ n \ n Online oggi". Entrambi produrranno gli stessi risultati? – user3705478

+2

@ user3705478 Entrambi producono gli stessi risultati, anche se ci sarebbero più spazi uno dopo l'altro. La differenza sta nel modo in cui viene gestita. Se si dispone di un gruppo di (ad esempio) 3 spazi direttamente uno dopo l'altro, \\ s + prende quel gruppo e lo trasforma interamente in un "", mentre \\ s procede ogni spazio da solo. – Daemun

7

Prima di tutto è necessario capire che l'output finale di entrambe le istruzioni sarà lo stesso, ovvero rimuovere tutti gli spazi dalla stringa specificata.

Tuttavia x.replaceAll("\\s+", ""); sarà modo più efficiente di rifilatura spazi (se stringa può avere più spazi contigui) per potenzialmente meno non di sostituzioni dovute al di fatto che regex \\s+ partite 1 o più spazi contemporaneamente e li sostituisce con stringa vuota .

Quindi, anche se si ottiene lo stesso output di entrambi è meglio usare:

x.replaceAll("\\s+", "");