Domanda

Ad esempio, in questo testo:

  

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc eu tellus vel nunc Pretium Lacinia. Proin sed lorem. Cras sed ipsum. Nunc un libero quis risus sollicitudin imperdiet.

Voglio abbinare la parola dopo 'ipsum'.

È stato utile?

Soluzione

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+)

Questa corrisponderà a qualsiasi sequenza di caratteri lettera che segue "ipsum" come una parola intera seguita da uno spazio. Lo fa non match "ipsum" in sé, non è necessario preoccuparsi di reinserirla nel caso di, ad esempio, sostituzioni.

Come ho detto, 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 sarebbe di lavoro.)

Altri suggerimenti

Alcuni degli altri soccorritori hanno suggerito di usare un'espressione regolare che non dipende lookbehinds, ma penso che un esempio di lavoro completo è necessaria per ottenere il punto attraverso. L'idea è di far corrispondere l'intera sequenza ( "ipsum" 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 "dolor" e "Nunc". Per fare questo con la versione lookbehind, si dovrebbe fare qualcosa di hacker come:

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

Questo è in 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 a tutti.

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 per abbinare il 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 Ho visto ripetuto in alcuni libri e tutorial, ma il costrutto parola confine, \b, non corrisponde a qualsiasi 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 preceduto da uno.

ipsum \ b (\ w *)

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

Questo leggerà la seconda occorrenza pure (Nunc)

ipsum \ b (. *) \ B

EDIT: anche se a seconda dell'implementazione regex, questo potrebbe essere affamato e trovare tutte le parole dopo ipsum

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top