Je voudrais extraire la sous-chaîne entre certains deux mots à l'aide de Java.
Par exemple: P>
String sentence = "This is an important example about regex for my work and for me";
Pattern pattern = Pattern.compile("(?<=an).*.(?=for)");
Matcher matcher = pattern.matcher(sentence);
boolean found = false;
while (matcher.find()) {
System.out.println("I found the text: " + matcher.group().toString());
found = true;
}
if (!found) {
System.out.println("I didn't found the text");
}
3 Réponses :
Votre regex est " an \\ s + (. *?) \\ s + pour code>". Il extrait tous les caractères entre un et pour ignorer les espaces blancs ( \ s + code>). Le point de question signifie «gourmand». Il est nécessaire d'empêcher le modèle . * Code> pour tout manger, y compris le mot "pour". P>
Une marque d'interrogation fait un quantificateur Ungredy. Vous manquez le quantificateur de votre réponse. Vous recherchez donc un caractère arbitraire et vous êtes facultatif avec votre point d'interrogation.
@Alexr: Merci, ça marche, mais ajoutez * comme ça: "An \\ s + (. *?) \\ s + pour"
Pour votre première question, faites-la paresseuse. Vous pouvez mettre un point d'interrogation après le quantificateur, puis le quantificateur correspondra au moins que possible. Je n'ai aucune idée de ce que le supplément Pour votre deuxième question, vous devez définir ce qu'un "mot" est. Je dirais ici probablement une séquence de non -espace non blanche suivie d'une espace blanche. Quelque chose comme ça p> et répétez ceci 3 fois comme celui-ci p> pour vous assurer que le modèle mathes sur les mots entiers utilise limites de mots p> voir en ligne ici sur Regexr p> P> P> P> P> comme DMA_K correctement indiqué dans votre cas, il n'est pas nécessaire d'utiliser l'aspect derrière et de regarder en avant. Voir ici la Documentation relevable sur les groupes P> Vous pouvez utiliser des groupes de capture à la place. Il suffit de mettre la pièce que vous souhaitez extraire entre crochets et il sera mis dans un groupe de capture. P> voir Vous pouvez accéder à ce groupe comme celui-ci p> Vous n'en avez qu'un Paire de crochets, donc sa simple, il suffit de mettre un . Code> à la fin est Bon pour dans . *. code> son inutile. P> {3} code> correspondra exactement à 3 pendant un minimum de 1 et un max de 3 correspondent à ce {1,3} code> p> 1 code> dans corporter.group (1) code> pour accéder au premier groupe de capture. P> P>
Je conseillerais également de ne pas utiliser la syntaxe de regarder à l'avance / derrière la syntaxe. Pourquoi compliquer les choses? an \ b (. *?) \ Bffor code> fera parfaitement le travail.
Comme @dmk_k (merci) correctement indiqué, il n'est pas nécessaire d'utiliser des constructions avancées ici dans votre cas, j'ai mis à jour ma réponse avec une solution plus simple.
@ Systema: Merci pour votre aide. La deuxième alternative ne fonctionne pas pour moi, je ne sais pas pourquoi il ne pouvait pas trouver le texte. Une autre chose que je veux "un" d'être le mot séparé "An" Pas une partie d'un mot comme "et" ou "important".
@Daisy j'ai mis à jour ma solution ajoutant \ b code> limites de mots. J'ai également ajouté des liens vers "Regexr", c'est un bon outil en ligne où vous pouvez tester vos regextes.
Mais je me demande pourquoi cela est plus facile que de regarder l'avenir / derrière? Et quand dois-je utiliser regarder l'avenir / derrière?
@Daisy Voici un Explication dans un tutoriel Perl , le comportement des regards de surveillance perl et de ceux de Java sont les mêmes.
Ceci (? <= An). *? (? = For) Snippet fonctionne bien, merci. Alors, comment puis-je appliquer cet exemple de droite à gauche? Merci d'avance.
Je veux dire, extraire à la corde droite au côté gauche. Comme exemple de cette question; La première position est (pour) la deuxième position est (a). Donc, l'extraction du processus fonctionne de manière arrière. Mon anglais n'est pas bon. Désolé.
@Kerberos il vaut probablement mieux si vous posez une nouvelle question. Veuillez décrire le détail de ce que vous avez en tant qu'entrée et ce que vous voulez obtenir en conséquence (et bien sûr ce que vous avez essayé ;-)).
@Alexr, @sterna - J'ai 2 cordes: "PCRID = 37398932585 & PMT = & PLC = www.mamapedia.com" et "pcrid = 1369865469 & pMT = BB". J'ai utilisé la méthode de motivation de le faire pour extraire le PCRID et le PMT. Bien que PCRID fonctionne bien, j'aimerais savoir comment extraire le PMT. J'ai fait: motif PMT = mods.comPILE ("(? <= PMT =). *. (& *?)" ") Code> Il renvoie '& plc = www.mamapedia.com' et 'BB' respectivement. Comment réécrire PMT code> pour la récupérer, dans le premier cas, rien du tout, et dans n'importe quel autre cas, seuls les alphabets qui suivent PMT = code> et pour ignorer tout Et tous les caractères spéciaux qui arrivent après la fin du dernier caractère?
Classe publique Substringbetween { } P> P>
Voulez-vous que le modèle ne correspondait que s'il n'y a que 3 mots entre «an» et «pour», ou voulez-vous seulement les 3 mots quel que soit le nombre de mots du match?
@ Dragon8: Je ne veux que les 3 mots quel que soit le nombre de mots du match.
OK, alors vous pouvez diviser le match après avec
selstring.split ("") code>. Il renvoie une gamme de chaînes là-bas. Chaque position est un mot de votre match.