2016-07-04 63 views
11

Supponiamo, ho una stringa:Perché devo specificare l'intera stringa nell'espressione regolare Java?

String str = "some strange string with searched symbol"; 

E voglio cercare in essa alcuni simboli, supponiamo sarà "string". Quindi abbiamo un seguente:

str.matches("string"); //false 
str.matches(".*string.*"); //true 

Quindi, come indicato nel titolo, perché devo specificare intera stringa in Java espressione regolare?

documentazione Java dice:

pubbliche partite booleani (String regex)

indica se o no questa stringa corrisponde all'espressione regolare data.

Non dice

indica se o no tutto questo stringa corrisponde all'espressione regolare data.

Ad esempio, nel php sarebbe:

$str = "some strange string with searched symbol"; 
var_dump(preg_match('/string/', $str)); // int(1) 
var_dump(preg_match('/.*string.*/', $str)); //int(1) 

Quindi, entrambe le regex di sarà true.
e credo che questo è corretto, perché se voglio mettere alla prova tutta la stringa che vorrei fare str.matches("^string$");

PS: Sì, lo so che è quello di cercare un stringa, più semplice e più veloce sarà quello di utilizzare str.indexOf("string") oppure str.contains("string"). La mia domanda riguarda solo l'espressione regolare di Java.


UPDATE: Come affermato da @ ChrisJester-Young (e @GyroGearless) una delle soluzioni, se si vuole cercare regex che fa parte di una stringa soggetto, è quello di utilizzare find() metodo come questo:

String str = "some strange string with searched symbol"; 
    Matcher m = Pattern.compile("string").matcher(str); 
    System.out.println(m.find()); //true 
+0

è possibile utilizzare 'find' func all'interno di' if'. –

+2

Javadoc per la classe 'Matcher' è piuttosto chiaro su questo:" Il metodo match cerca di far corrispondere l'intera sequenza di input al pattern. " –

+4

Java ha pochi problemi con i metodi non intenzionali di denominazione nel reparto regex. Ad esempio 'replace (str, str)' vs 'replaceAll (str, str)'. Non è ovvio che * solo * la differenza tra questi due sia che 'replace' non usa la sintassi regex mentre' replaceAll' fa (entrambi i metodi sostituiranno tutte le occorrenze o il testo selezionato). Sfortunatamente tutto ciò che possiamo fare ora è accettarlo, fare la nostra parte di errori e infine abituarci. – Pshemo

risposta

15

matches corrisponde sempre all'intera stringa di input. Se si desidera consentire la corrispondenza delle sottostringhe, utilizzare find.

+1

Intendi: 'Pattern.compile (" stringa "). Matcher (str) .find()'? – spirit

+1

@spirit corretto. Purtroppo non esiste una comoda funzione di convenienza per la classe 'String'. :-( –

+0

Agreed =) Sarebbe meglio se ci fosse un metodo 'str.find (" regex ")' – spirit

3

Come la documentazione lei suggerisce,

partite pubbliche booleani (String regex)

indica se o no questa stringa corrisponde all'espressione regolare data.

Che cosa significa è se la stringa corrisponde con il dato regex. Ad esempio, matches verifica se la stringa è un'istanza della regex specificata.

non se contiene una stringa che è un esempio della proposta regex. Come suggerito da Chris, puoi usare find o per il tuo problema puoi usare contains.

0

Sì, come già sapete (ora) che matches() restituirà true solo per la stringa completa.

Ma, l'aggiornamento, si è affermato che:

Come affermato da @ ChrisJester-Young (e @GyroGearless) l'unica soluzione, se si vuole cercare regex che fa parte di un string oggetto, è quello di utilizzare il metodo() find ...

vorrei dire che l'utilizzo di find() è non è l'unica soluzione. C'è almeno un altro, che so:

String str = "some strange string with searched symbol"; 
boolean found = str.split("string").length>1; 
System.out.println(found); 

Questo stampa true. E questo funzionerà per tutte le espressioni regolari. Anche se questo non è il modo di farlo, ed è invece un hack.

Potrebbero esserci molte più soluzioni.

+0

Sono abbastanza sicuro che ci siano molti ** hack ** per ottenere lo stesso risultato =). Stavo raccontando il modo * giusto * per ottenere questo. Ma ora capisco, questa è stata solo la mia opinione. Rimosso * solo * =) – spirit

+0

@spirit Hai rimosso solo l'unico solo nella tua domanda? Solo? Ok. Solo! : P – Hackerdarshi

Problemi correlati