10
votes

Extrait de sous-chaîne entre deux mots certains mots à l'aide de Regex en Java

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 commentaires

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 ("") . Il renvoie une gamme de chaînes là-bas. Chaque position est un mot de votre match.


3 Réponses :


3
votes

Votre regex est " an \\ s + (. *?) \\ s + pour ". Il extrait tous les caractères entre un et pour ignorer les espaces blancs ( \ s + ). Le point de question signifie «gourmand». Il est nécessaire d'empêcher le modèle . * pour tout manger, y compris le mot "pour".


2 commentaires

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"



8
votes

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. XXX

Je n'ai aucune idée de ce que le supplément . à la fin est Bon pour dans . *. son inutile.

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 xxx

et répétez ceci 3 fois comme celui-ci xxx

pour vous assurer que le modèle mathes sur les mots entiers utilise limites de mots xxx

voir en ligne ici sur Regexr

{3} correspondra exactement à 3 pendant un minimum de 1 et un max de 3 correspondent à ce {1,3}

Alternative:

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

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. xxx

voir en ligne ici sur Regexr

Vous pouvez accéder à ce groupe comme celui-ci xxx

Vous n'en avez qu'un Paire de crochets, donc sa simple, il suffit de mettre un 1 dans corporter.group (1) pour accéder au premier groupe de capture.


10 commentaires

Je conseillerais également de ne pas utiliser la syntaxe de regarder à l'avance / derrière la syntaxe. Pourquoi compliquer les choses? an \ b (. *?) \ Bffor 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 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 =). *. (& *?)" ") Il renvoie '& plc = www.mamapedia.com' et 'BB' respectivement. Comment réécrire PMT 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 = et pour ignorer tout Et tous les caractères spéciaux qui arrivent après la fin du dernier caractère?



2
votes

Classe publique Substringbetween { XXX

}


0 commentaires