Java – Estrai le stringhe con Regex

Ho questa corda

String myString ="A~BC~FGH~~zuzy|XX~ 1234~ ~~ABC~01/01/2010 06:30~BCD~01/01/2011 07:45"; 

e ho bisogno di estrarre queste 3 sottostringhe
1234
06:30
07:45

Se utilizzo questa regex \\ d {2} \: \\ d {2} sono in grado di estrarre solo la prima ora 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.group (1) genera un’eccezione.
Inoltre non so come estrarre 1234. Questa stringa può cambiare ma viene sempre dopo ‘XX ~’
Hai qualche idea su come abbinare queste stringhe con espressioni regex?

AGGIORNARE

Grazie al suggerimento di Adam ho ora questa regex che corrisponde alla mia stringa

 Pattern p = Pattern.compile(".*XX~ (\\d{3,4}).*(\\d{1,2}:\\d{2}).*(\\d{1,2}:\\d{2})"; 

Abbino il numero e le 2 ore con matcher.group (1); matcher.group (2); matcher.group (3);

La funzione matcher.group() aspetta di prendere un singolo argomento intero: l’indice del gruppo di acquisizione, a partire da 1. L’indice 0 è speciale, che significa “l’intera corrispondenza”. Un gruppo di cattura viene creato utilizzando una coppia di parentesi ” (...) “. Qualcosa tra parentesi è cattura. I gruppi sono numerati da sinistra a destra (di nuovo, a partire da 1), aprendo una parentesi (il che significa che i gruppi possono sovrapporsi). Poiché non ci sono parentesi nell’espressione regolare, non può esserci alcun gruppo 1.

Javadoc nella class Pattern copre la syntax delle espressioni regolari.

Se stai cercando uno schema che potrebbe ripresentarsi un certo numero di volte, puoi utilizzare Matcher. find () ripetutamente finché non restituisce false. Matcher.group(0) una volta su ogni iterazione restituirà ciò che corrisponde a quel momento.

Se vuoi creare una grande espressione regolare che corrisponda a tutto in una volta (che credo sia ciò che desideri), quindi intorno a ciascuno dei tre gruppi di cose che vuoi catturare, metti un insieme di parentesi acquisite, usa Matcher.match() e quindi Matcher.group(n) dove n è rispettivamente 1, 2 e 3. Ovviamente Matcher.match() potrebbe anche restituire false, nel qual caso il pattern non corrisponde e non è ansible recuperare nessuno dei gruppi.

Nel tuo esempio, quello che probabilmente vuoi fare è farlo coincidere con il testo precedente, quindi avviare un gruppo di cattura, abbinare le cifre, terminare il gruppo di cattura, ecc … Non so abbastanza sul tuo esatto formato di input, ma ecco un esempio.

Diciamo che avevo delle stringhe nella forma:

 Eat 12 carrots at 12:30 Take 3 pills at 01:15 

E volevo estrarre la quantità e i tempi. La mia espressione regolare sarebbe simile a qualcosa:

 "\w+ (\d+) [\w ]+ (\d{1,2}:\d{2})" 

Il codice sarebbe simile a qualcosa:

 Pattern p = Pattern.compile("\\w+ (\\d+) [\\w ]+ (\\d{2}:\\d{2})"); Matcher m = p.matcher(oneline); if(m.matches()) { System.out.println("The quantity is " + m.group(1)); System.out.println("The time is " + m.group(2)); } 

L’espressione regolare significa “una stringa contenente una parola, uno spazio, una o più cifre (che sono catturate nel gruppo 1), uno spazio, un insieme di parole e spazi che termina con uno spazio, seguito da un tempo (catturato nel gruppo 2 e il tempo presuppone che l’ora sia sempre impostata su 0 a 2 cifre). Vorrei dare un esempio più vicino a ciò che stai cercando, ma la descrizione del ansible input è un po ‘vaga.