Confus au sujet du groupe Matcher dans la regex Java

J’ai la ligne suivante,

typeName="ABC:xxxxx;"; 

J’ai besoin d’aller chercher le mot ABC ,

J’ai écrit l’extrait de code suivant,

 Pattern pattern4=Pattern.comstack("(.*):"); matcher=pattern4.matcher(typeName); Ssortingng nameStr=""; if(matcher.find()) { nameStr=matcher.group(1); } 

Donc si je mets le group(0) j’obtiens ABC: mais si je mets le group(1) c’est ABC , alors je veux savoir

  1. Que signifie ce 0 et 1 ? Ce sera mieux si quelqu’un peut m’expliquer avec de bons exemples.

  2. Le motif regex contient un : dans ce cas, alors pourquoi le résultat du group(1) omet-il? Le groupe 1 détecte-t-il tous les mots entre parenthèses?

  3. Donc, si je mets deux autres parenthèses telles que \\s*(\d*)(.*) : Y aura-t-il deux groupes? group(1) renverra la partie (\d*) et le group(2) renverra la partie (.*) ?

L’extrait de code a été donné dans un but pour effacer mes confusions. Ce n’est pas le code que je traite. Le code ci-dessus peut être fait avec Ssortingng.split() de manière beaucoup plus simple.

Capture et regroupement

Le groupe de capture (pattern) crée un groupe qui possède une propriété de capture .

Un élément apparenté que vous pouvez souvent voir (et utiliser) est (?:pattern) , qui crée un groupe sans capturer de propriété, donc nommé groupe sans capture .

Un groupe est généralement utilisé lorsque vous devez répéter une séquence de motifs, par exemple (\.\w+)+ , ou pour spécifier où l’alternance doit prendre effet, par exemple ^(0*1|1*0)$ ( ^ , puis 0*1 ou 1*0 , puis $ ) versus ^0*1|1*0$ ( ^0*1 ou 1*0$ ).

Un groupe de capture, outre le regroupement, enregistrera également le texte correspondant au motif à l’intérieur du groupe de capture (pattern) . Dans votre exemple, (.*): , .* Correspond à ABC et : correspond à : et puisque .* Est à l’intérieur du groupe de capture (.*) , Le texte ABC est enregistré pour le groupe de capture 1.

Numéro de groupe

Le motif entier est défini comme étant le numéro de groupe 0.

Tout groupe de capture dans le modèle commence à indexer à partir de 1. Les index sont définis par l’ordre des parenthèses d’ouverture des groupes de capture . Par exemple, voici les 5 groupes de capture dans le modèle ci-dessous:

 (group)(?:non-capturing-group)(g(?:ro|u)p( (nested)inside)(another)group)(?=assertion) | | | | | | || | | 1-----1 | | 4------4 |5-------5 | | 3---------------3 | 2-----------------------------------------2 

Les numéros de groupe sont utilisés dans back-reference \n dans pattern et $n dans la chaîne de remplacement.

Dans les autres expressions de regex (PCRE, Perl), elles peuvent également être utilisées dans les appels de sous-routine .

Vous pouvez accéder au texte correspondant à certains groupes avec Matcher.group(int group) . Les numéros de groupe peuvent être identifiés avec la règle indiquée ci-dessus.

Dans certaines versions de regex (PCRE, Perl), il existe une fonction de réinitialisation de twig qui vous permet d’utiliser le même numéro pour capturer des groupes dans différentes twigs d’alternance .

Nom de groupe

A partir de Java 7, vous pouvez définir un groupe de capture nommé (?pattern) et accéder au contenu correspondant à Matcher.group(Ssortingng name) . Le regex est plus long, mais le code est plus significatif, car il indique ce que vous essayez de faire correspondre ou d’extraire avec le regex.

Les noms de groupe sont utilisés dans la référence arrière \k dans le modèle et ${name} dans la chaîne de remplacement.

Les groupes de capture nommés sont toujours numérotés avec le même schéma de numérotation, de sorte qu’ils sont également accessibles via Matcher.group(int group) .

En interne, l’implémentation de Java ne fait que mapper du nom au numéro de groupe. Par conséquent, vous ne pouvez pas utiliser le même nom pour 2 groupes de capture différents.

Pour le rest de nous

Voici un exemple simple et clair de la façon dont cela fonctionne

Regex: ([a-zA-Z0-9]+)([\s]+)([a-zA-Z ]+)([\s]+)([0-9]+)

Chaîne: "!* UserName10 John Smith 01123 *!"

 group(0): UserName10 John Smith 01123 group(1): UserName10 group(2): group(3): John Smith group(4): group(5): 01123 

Comme vous pouvez le voir, j’ai créé CINQ groupes qui sont chacun entre parenthèses.

J’ai inclus le! * Et *! de chaque côté pour le rendre plus clair. Notez qu’aucun de ces caractères ne figure dans le RegEx et ne sera donc pas généré dans les résultats. Le groupe (0) vous donne simplement la chaîne complète (tous mes critères de recherche sur une seule ligne). Le groupe 1 s’arrête juste avant le premier espace car le caractère d’espace n’était pas inclus dans les critères de recherche. Les groupes 2 et 4 sont simplement l’espace blanc, qui dans ce cas est littéralement un espace, mais pourrait également être un onglet, un saut de ligne, etc. Le groupe 3 inclut l’espace car je le mets dans les critères de recherche … etc.

J’espère que cela a du sens.

La parenthèse () est utilisée pour permettre le regroupement des phrases regex.

Le group(1) contient la chaîne entre parenthèses (.*) Donc .* Dans ce cas

Et le group(0) contient une chaîne complète correspondante.

Si vous aviez plus de groupes (read (...) ), il serait mis en groupes avec les index suivants (2, 3, etc.).