Estrai la stringa tra due stringhe in java

Provo a ottenere una stringa tra , ecco la mia implementazione:

String str = "ZZZZL  AFFF "; Pattern pattern = Pattern.compile(""); String[] result = pattern.split(str); System.out.println(Arrays.toString(result)); 

ritorna

 [ZZZZL , AFFF ] 

Ma la mia aspettativa è:

 [ dsn , AFG ] 

Dove mi sbaglio e come correggerlo?

Il tuo modello va bene. Ma non dovresti essere split() ting via, dovresti find() . Il seguente codice fornisce l’output che stai cercando:

 String str = "ZZZZL <%= dsn %> AFFF <%= AFG %>"; Pattern pattern = Pattern.compile("<%=(.*?)%>"); Matcher matcher = pattern.matcher(str); while (matcher.find()) { System.out.println(matcher.group(1)); } 

Ho risposto a questa domanda qui: https://stackoverflow.com/a/38238785/1773972

Fondamentalmente uso

 StringUtils.substringBetween(str, "<%=", "%>"); 

Questo richiede la libreria “Apache commons lang”: https://mvnrepository.com/artifact/org.apache.commons/commons-lang3/3.4

Questa libreria ha molti metodi utili per lavorare con le stringhe, trarrai vantaggio dall’esplorare questa libreria in altre aree del tuo codice java !!!

Il tuo regex sembra corretto, ma stai splitting con esso invece di matching con esso. Vuoi qualcosa di simile a questo:

 // Untested code Matcher matcher = Pattern.compile("<%=(.*?)%>").matcher(str); while (matcher.find()) { System.out.println(matcher.group()); } 

L’approccio di Jlordo copre una situazione specifica. Se provi a creare un metodo astratto, puoi affrontare una difficoltà per verificare se ” textFrom ” è prima di ” textTo “. In caso contrario, il metodo può restituire una corrispondenza per qualche altra occorrenza di ” textFrom ” nel testo.

Ecco un metodo astratto pronto all’uso che copre questo svantaggio:

  /** * Get text between two strings. Passed limiting strings are not * included into result. * * @param text Text to search in. * @param textFrom Text to start cutting from (exclusive). * @param textTo Text to stop cuutting at (exclusive). */ public static String getBetweenStrings( String text, String textFrom, String textTo) { String result = ""; // Cut the beginning of the text to not occasionally meet a // 'textTo' value in it: result = text.substring( text.indexOf(textFrom) + textFrom.length(), text.length()); // Cut the excessive ending of the text: result = result.substring( 0, result.indexOf(textTo)); return result; }