2015-12-14 10 views
6

come faccio a tirare la "16" per entrambeCome tirare fuori frase di una stringa

  • Bar Foo Bar: Foo8: 16 Foo Bar Bar foo Barz
  • 8:16 Foo Bar Bar foo Barz

Ecco che cosa ho provato

String V,Line ="Bar Foo Bar: Foo8:16 Foo Bar Bar foo barz"; 
V = Line.substring(Line.indexOf("([0-9]+:[0-9]+)+")+1); 
V = V.substring(V.indexOf(":")+1, V.indexOf(" ")); 
System.out.println(V); 

E qui è l'errore che ottengo

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -9 
    at java.lang.String.substring(String.java:1955) 
    at Indexing.Index(Indexing.java:94) 
    at Indexing.main(Indexing.java:24) 

ho provato l'espressione regolare ("([0-9] + [0-9] +) +") a http://regexr.com/ ed evidenziare correttamente il "08:16"

+0

Qual è uscita aspettarsi? – Abdelhak

+1

È necessario utilizzare la libreria Java Regex per elencare il tipo di ricerca nel modo desiderato. Non puoi semplicemente eseguire "indexOf" con un'espressione regolare. –

+3

la funzione ['indexOf()'] (http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#indexOf%28java.lang.String%29) non prendi un'espressione regolare –

risposta

5

è necessario inserire la gruppo di cattura sulla seconda [0-9]+ (o equivalente, \d+) e usare una Matcher#find():

String value1 = "Bar Foo Bar: Foo8:16 Foo Bar Bar foo barz"; 
String pattern1 = "\\d+:(\\d+)"; // <= The first group is the \d+ in round brackets 
Pattern ptrn = Pattern.compile(pattern1); 
Matcher matcher = ptrn.matcher(value1); 
if (matcher.find()) 
    System.out.println(matcher.group(1)); // <= Print the value captured by the first group 
else 
    System.out.println("false"); 

Vedi demo

+0

Buona risposta. Questo è il modo più sicuro per farlo. –

+0

cosa dovrebbe andare storto per matcher.find() per restituire false –

+0

Se un modello non corrisponde a nessuna parte all'interno della stringa di input, il risultato restituito è falso. In realtà, nella maggior parte dei casi l'istruzione 'else' è stata omessa, l'ho appena aggiunta per la completezza del codice. –

0

String.indexOf (str String) d Non prendere una regex. Ci vuole una corda.

Si può semplicemente fare questo:

String V, Line = "Bar Foo Bar: Foo8:16 Foo Bar Bar foo barz"; 
V = Line.substring(Line.indexOf("16"), Line.indexOf("16") + 2); 
System.out.println(V); 

O per far sembrare più ordinata, è possibile sostituire questa linea:

V = Line.substring(Line.indexOf("16"), Line.indexOf("16") + 2); 

con:

int index = Line.indexOf("16"); 
V = Line.substring(index, index + 2); 
+0

Stai girando in tondo. BTW non conosco il valore di "16" o "8". solo che hanno i due punti nel mezzo e potrebbero avere più due punti intorno a esso –

+0

Se il valore è memorizzato in una variabile, puoi fare la stessa cosa, eccetto che lo faresti: Line.indexOf (String.valueOf (value)) ; Come esattamente vado in circolo? – Fazer

+0

perché se sappiamo cosa sia 'value' allora possiamo semplicemente fare' V = value' –

Problemi correlati