Java - Extraire les chaînes avec la Regex
J'ai cette chaîne
String myString ="A~BC~FGH~~zuzy|XX~ 1234~ ~~ABC~01/01/2010 06:30~BCD~01/01/2011 07:45";
et j'ai besoin d'extraire ces 3 chaînes
1234
06:30
07:45
Si j'utilise cette expression \\d{2}\:\\d{2} je suis seulement en mesure d'extraire la première heure 06:30
Pattern depArrHours = Pattern.compile("\\d{2}\\:\\d{2}");
Matcher matcher = depArrHours.matcher(myString);
String firstHour = matcher.group(0);
String secondHour = matcher.group(1); (IndexOutOfBoundException no Group 1)
matcher.groupe(1) lève une exception.
Aussi, je ne sais pas comment faire pour extraire 1234. Cette chaîne peut changer, mais il vient toujours après "XX~'
Avez-vous une idée sur la façon de combiner ces chaînes avec les expressions régulières?
Mise à JOUR
Merci à Adam suggestion j'ai maintenant cette regex qui correspondent à ma chaîne
Pattern p = Pattern.compile(".*XX~ (\\d{3,4}).*(\\d{1,2}:\\d{2}).*(\\d{1,2}:\\d{2})";
Je correspondre au nombre, et les 2 heures avec matcher.groupe(1); matcher.groupe(2); matcher.groupe(3);
Peux-tu montrer ton code? Qui doit correspondre à 06:30, offrant tout le reste est en ordre.
OriginalL'auteur mickthompson | 2009-08-03
Vous devez vous connecter pour publier un commentaire.
La
matcher.group()
fonction attend pour prendre un seul argument entier: La capture de l'indice de groupe, à partir de 1. L'indice 0 est spécial, ce qui signifie "l'ensemble du match". Une capture d'un groupe est créé à l'aide d'une paire de parenthèses "(...)
". Rien à l'intérieur de la parenthèse est capture. Les groupes sont numérotés de gauche à droite (encore une fois, à partir de 1), par parenthèse ouvrante (ce qui signifie que les groupes peuvent se chevaucher). Depuis il n'y a pas de parenthèse dans votre expression régulière, il ne peut y avoir de groupe 1.La javadoc sur le Modèle classe couvre la syntaxe d'expression régulière.
Si vous êtes à la recherche d'un modèle qui pourrait se reproduire certains nombre de fois, vous pouvez utiliser
Matcher.
trouver() à plusieurs reprises jusqu'à ce qu'elle retourne false.Matcher.group(0)
une fois à chaque itération sera ensuite de retour à ce qui correspondait à celle du temps.Si vous voulez construire une grande expression régulière qui correspond tout à la fois (je crois que c'est ce que vous voulez), puis autour de chacun des trois ensembles de choses que vous voulez capturer, mettre un jeu de capture de la parenthèse, l'utilisation
Matcher.match()
et puisMatcher.group(n)
où n est 1, 2 et 3, respectivement. Bien sûrMatcher.match()
pourrait également renvoyer faux, auquel cas le modèle ne correspondent pas, et vous ne pouvez pas récupérer les groupes.Dans votre exemple, ce que vous souhaitez faire est sans doute ont-il correspondre à certains texte précédent, puis démarrez une capture d'un groupe, d'un match de chiffres, de mettre fin à la capture d'un groupe, etc...je ne connais pas assez votre format d'entrée, mais ici est un exemple.
Permet de dire que j'avais des chaînes de la forme:
Et je voulais extrait de la quantité et de temps. Mon expression régulière serait quelque chose comme:
Le code ressemblerait à quelque chose comme:
L'expression régulière signifie "une chaîne de caractères contenant un mot, un espace, un ou plusieurs chiffres (qui sont capturés dans le groupe 1), un espace, un ensemble de mots et les espaces se terminant par un espace, suivi par un temps (capturés dans le groupe 2, et le temps suppose que l'heure est toujours à 0-collier à 2 chiffres). Je voudrais donner un exemple plus proche de ce que vous cherchez, mais la description de l'entrée possible est un peu vague.
Salut Adam, le format de mon entrée est toujours le même. J'ai besoin d'extraire les 2 heures et le nombre après le XX~ string (1234 dans l'exemple du cas). Ce nombre peut être de {3,4} chiffres.
J'espère que cela va aider les autres. Vous besoin pour appeler
m.matches()
(oum.find()
) avant l'appel de m.groupe(), sinon, il va dire: il n'y a pas tout les matchs (parce qu'il ne l'ai pas encore), au moins ce est ce qui se passe sur Android.OriginalL'auteur