Question

Par exemple, dans ce texte:

  

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

Je veux faire correspondre le mot après 'ipsum'.

Était-ce utile?

La solution

Cela ressemble à un travail pour assertions arrières, mais vous devez être conscient que toutes les saveurs regex les soutenir. Dans votre exemple:

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

correspondra à une séquence de caractères de lettre qui suit « ipsum » comme un mot entier suivi d'un espace. Finalité pas Match « ipsum » lui-même, vous n'avez pas à vous soucier de la réinsérant dans le cas, par exemple remplacements.

Comme je l'ai dit, cependant, des saveurs (JavaScript, par exemple) ne prennent pas en charge lookbehind du tout. Beaucoup d'autres (la plupart, en fait) prennent en charge que « largeur fixe » assertions arrières - donc vous pouvez utiliser cet exemple, mais aucun des opérateurs de répétition. (En d'autres termes, (?<=\b\w+\s+)(\w+) ne serait pas travail.)

Autres conseils

Certains des autres intervenants ont suggéré d'utiliser une expression rationnelle qui ne dépend pas d'assertions arrières, mais je pense un exemple de travail complet, est nécessaire pour obtenir le point à travers. L'idée est que vous correspondez la séquence complète ( « ipsum » plus le mot suivant) de la manière habituelle, puis utiliser un groupe de capture pour isoler la partie qui vous intéresse. Par exemple:

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));
}

Notez que cette affiche à la fois « dolor » et « Nunc ». Pour ce faire avec la version lookbehind, vous devez faire quelque chose comme hackish:

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

C'est en Java, ce qui nécessite l'lookbehind d'avoir une longueur maximale évidente. Certaines saveurs n'ont même qu'une grande flexibilité, et bien sûr, certains ne supportent pas du tout d'assertions arrières.

Cependant, le plus grand problème des gens semblent avoir dans leurs exemples ne sont pas avec assertions arrières, mais avec des limites de mots. Les deux David Kemp et ck semblent attendre \b pour correspondre au caractère de l'espace suivant le « m », mais il ne fait pas; elle correspond à la position (ou limite) entre le 'm' et l'espace.

Il est une erreur commune, que je l'ai même vu dans répétais quelques livres et des tutoriels, mais la construction de limite de mot, \b, ne correspond jamais à des personnages. C'est une affirmation, comme lookarounds et ancres (^, $, \z, etc.) zéro largeur, et ce qu'il correspond à une position qui est soit précédée d'un caractère de mot et non suivi d'un ou suivi d'un caractère de mot et non précédé d'un.

ipsum \ b (\ w *)

Avec javascript vous pouvez utiliser (?=ipsum.*?(\w+))

obtiendra la deuxième occurrence aussi bien (Nunc)

ipsum \ b (. *) \ B

EDIT: bien que la mise en œuvre en fonction de votre regex, cela pourrait être après ipsum faim et trouver tous les mots

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top