2016-06-18 5 views
6
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class test { 
    public static void main(String[] args) { 
     String a ="12341234"; 
     String regex="^(\\d+?)\\1$"; 
     Pattern p=Pattern.compile(regex); 
     Matcher matcher = p.matcher(a); 

     while(matcher.find()) { 
      System.out.println(matcher.group(1)); 
     } 
    } 
} 

Utilizzando il Matcher e la regex di cui sopra, ottengo qualsiasi ripetizione. Tuttavia, voglio solo ripetizioni di taglia 2 o superiore. Quando ho provato a fare la regex diCome si usa un'espressione regolare per trovare una ripetizione consecutiva in una stringa (ad esempio [12] [12]) ma solo di lunghezza 2 o maggiore?

^(\\d+?){2,100}\\1$ 

, nulla è stato restituito quando ho eseguito il programma, anche se ci fosse una ripetizione tra la lunghezza 2 e 100. Che cosa sto facendo di sbagliato?

+0

Mai dire mai, ma non sono così sicuro che questo è il tipo di problema che i Regex sono progettati per risolvere. Nel frattempo, risolvere questo proceduralmente è banale ... – nasukkin

risposta

3

La tua idea è giusta, devi solo aggiustare un po '. Prova questo:

(\d{2,100})\1 

Ho provato [here]

Aggiornamento per la richiesta di HSCoder:

assicurarsi che la sequenza ripetuta non ha due consecutivi numeri che sono la stessa cosa? Ad esempio, [11] [11] non avrebbe funzionato, ma [12] [12] sarebbe

Beh, è ​​abbastanza doloroso per ottenere ogni due numeri consecutivi che sono diverse. Prova questo:

((?:(?=0[^0]|1[^1]|2[^2]|3[^3]|4[^4]|5[^5]|6[^6]|7[^7]|8[^8]|9[^9])\d)+\d)\1 

Ho provato [here]

+3

Potrebbe valere la pena notare che {2,} corrisponderà letteralmente a 2 o più invece di un limite a 100 (Se è quello che stai cercando). '(\ d {2,}) \ 1' –

+0

Ho un limite di 100 poiché non sapevo che non lasciare nulla dopo la virgola avrebbe significato qualcosa di più grande. – HSCoder

+0

Inoltre, ho dimenticato di specificare ... ma come fare per assicurarmi che la sequenza ripetuta non abbia due numeri consecutivi uguali? Ad esempio, [11] [11] non funzionerebbe ma [12] [12] lo farebbe. – HSCoder

1

Descrizione

([0-9]{2,})\1+ 

Regular expression visualization

Questa espressione regolare farà il seguente:

  • Trova sottostringhe composte da 2 o più cifre che si ripetono 1 o più volte di seguito.

Esempio

Live Demo

https://regex101.com/r/cA5qB7/1

Testo di esempio

22222 
1111 
2323 
12341234 
123123123123 
123123123 
1 
11 
1212 
14 
14 
12345 

Esempio Partite

  • gruppo Capture 0 ottiene l'intera stringa corrispondente includere tutte le ripetizioni
  • gruppo Capture 1 ottiene il sottostringa che è stato ripetuto
[0][0] = 2222 
[0][1] = 22 

[1][0] = 1111 
[1][1] = 11 

[2][0] = 2323 
[2][1] = 23 

[3][0] = 12341234 
[3][1] = 1234 

[4][0] = 123123123123 
[4][1] = 123123 

[5][0] = 123123123 
[5][1] = 123 

[6][0] = 1212 
[6][1] = 12 

Spiegazione

NODE      EXPLANATION 
---------------------------------------------------------------------- 
    (      group and capture to \1: 
---------------------------------------------------------------------- 
    [0-9]{2,}    any character of: '0' to '9' (at least 2 
          times (matching the most amount 
          possible)) 
---------------------------------------------------------------------- 
)      end of \1 
---------------------------------------------------------------------- 
    \1+      what was matched by capture \1 (1 or more 
          times (matching the most amount possible)) 
----------------------------------------------------------------------