2009-02-13 11 views

risposta

26

questo suona come un lavoro per lookbehinds, anche se si dovrebbe essere consapevoli del fatto che non tutti i sapori regex li supportano. Nel tuo esempio:

(?<=\bipsum\s)(\w+) 

Ciò corrisponderà a qualsiasi sequenza di caratteri lettera che segue "lui" come una parola intera seguita da uno spazio. non corrisponde "molto" in sé, non è necessario preoccuparsi di reinserirla nel caso di esempio sostituzioni.

Come 1 Detto questo, però, alcuni sapori (JavaScript, ad esempio) non supportano lookbehind affatto. Molti altri (la maggior parte, in realtà) supportano solo lookbehinds "width fisso" - così si potrebbe utilizzare questo esempio, ma non uno qualsiasi degli operatori di ripetizione. (In altre parole,(?<=\b\w+\s+)(\w+)non funzionerebbe.)

+0

battere anche me :) – annakata

+0

I lookbehind tendono ad essere piuttosto limitati quando si tratta di utilizzare i caratteri jolly. – cletus

+0

Qui potrebbe non essere necessario neanche guardare alle spalle. A seconda di cosa "voglio abbinare" nella domanda si riferisce a, vedere la soluzione di David Kemp. – user55400

-1

che \ b \ B

EDIT (*.): anche se a seconda dell'implementazione regex, questo potrebbe essere affamato e trovare tutte le parole dopo che

+0

Che verrà abbinare il resto della frase. – cletus

+0

si deve fare quel ungreedy – tliff

+0

In realtà non dipende dall'implementazione, o almeno non ho mai incontrato un'implementazione regolare che non è avida di default. Non-goloso è sempre un cambiamento (almeno in Perl, PHP, Java e .Net). – cletus

1

che \ b (\ w *)

+0

Sembra che corrisponda solo a ipsum. –

+0

Probabilmente creerei che \ b + (\ w +) almeno – cletus

+0

ipsum \ b + (\ w +) non è un'espressione regolare valida. –

4

Alcuni degli altri soccorritori hanno suggerito di usare un'espressione regolare che non dipende lookbehinds, ma 1 pensare un esempio di lavoro completo è necessaria per ottenere il punto attraverso. L'idea è di far corrispondere l'intera sequenza ("Ricerca" più la parola successiva) in modo normale, quindi utilizzare un gruppo di cattura per isolare la parte che ti interessa. Ad esempio,

String s = "Lorem ipsum dolor sit amet, consectetur " + 
    "adipiscing elit. Nunc eu tellus vel nunc pretium " + 
    "lacinia. Proin sed lorem. Cras sed ipsum. Nunc " + 
    "a libero quis risus sollicitudin imperdiet."; 

Pattern p = Pattern.compile("ipsum\\W+(\\w+)"); 
Matcher m = p.matcher(s); 
while (m.find()) 
{ 
    System.out.println(m.group(1)); 
} 

Si noti che questa stampa sia "intelligente" e "ora". Per fare questo con la versione lookbehind, si dovrebbe fare qualcosa di simile hacker:

Pattern p = Pattern.compile("(?<=ipsum\\W{1,2})(\\w+)"); 

Questo è Java, che richiede la lookbehind avere una lunghezza massima evidente. Alcuni sapori non hanno nemmeno più di tanto la flessibilità, e, naturalmente, alcuni non supportano lookbehinds affatto.

Tuttavia, il problema più grande di persone sembrano avere nei loro esempi non è con lookbehinds, ma con i confini di parola. Sia David Kemp e CK sembrano aspettarsi \b che corrisponda al carattere di spazio che segue la 'M', ma non è così; corrisponde alla posizione (o di confine) tra la 'm' e lo spazio.

E 'un errore comune, uno 1've anche visto ripetuto in alcuni libri e tutorial, ma il costrutto parola confine, \b non corrisponde alcun carattere. È un asserzione a lunghezza zero, come lookarounds e ancoranti (^, $, \z, etc.), e ciò corrisponde è una posizione che è o preceduto da un carattere di parola e non seguita da uno, o seguito da un carattere di parola e non preceduta da uno.

0

Con javascript è possibile utilizzare (?=ipsum.*?(\w+))

In questo modo ottenere la seconda occorrenza così (Nunc)

Problemi correlati