2012-11-12 16 views
5

Sto cercando di trovare una regex per i seguenti:Java e lookbehind in regex

Tutti i mondi corrispondenti @[email protected] esattamente dove WORD potrebbe essere qualsiasi parola a tutti, ma sono solo dopo un =. ho fatto la seguente:
(?<==)#.*?#) che funziona, ma solo per i modelli come [email protected]@ o @[email protected] ma non per = @[email protected].
Sono anche interessato a non seguito da = ma non riuscivo a capirlo.
Ad ogni modo usando qualcosa come: (?<=\\s*=\\s*)#.*?#) ma non funziona.
Qualche idea?

Nota: Strano ma da here si dice che la lunghezza lookbehind variabile è non supportato in Java, ma questo non mi dà un'eccezione

risposta

0

Questo modello corrisponde a un pari, seguito da uno spazio opzionale e una parola racchiusi nei simboli @:

Pattern pattern = Pattern.compile("= [email protected](.*)@"); 
Matcher matcher = pattern.matcher("[email protected]@"); 
if (matcher.matches()) { 
    System.out.println(matcher.group(1)); 
} 

// Prints: "WORD" 

non riesco a vedere la necessità di una lookbehind, a meno che non ho capito male l'attività che si desidera realizzare. Tuttavia, il seguente dovrebbe funzionare:

Pattern pattern = Pattern.compile("(?<== ?)@(.*)@"); 
Matcher matcher = pattern.matcher("= @[email protected]"); 
if (matcher.find()) { 
    System.out.println(matcher.group(1)); 
} 

// Prints: "WORD" 

Il modello negativo viene poi realizzato come segue:

Pattern pattern = Pattern.compile("(?<!= ?)@(.*)@"); 
Matcher matcher = pattern.matcher("[email protected]@"); 
System.out.println(matcher.find()); 

// Prints: "false" 
1

Se si sta utilizzando look-dietro, sto supponendo che si sta utilizzando e PatternMatcher direttamente, per prendere le parole pulite ("@[email protected]" anziché "= @[email protected]").

Se questo è davvero il caso, tutto quello che dovete fare è aggiungere un white-space opzionale all'interno del look-dietro:

(?<==\\s?)@.*[email protected]


Ecco un test-code, tornando "@[email protected]" :

Matcher m = Pattern.compile("(?<==\\s?)@.*[email protected]").matcher("= @[email protected]"); 
m.find(); 
System.out.println(m.group());