Crea una serie di corrispondenze regolari

In Java sto provando a restituire tutte le corrispondenze regex a un array ma sembra che sia ansible controllare solo se il pattern corrisponde o meno a qualcosa (booleano). Qualcuno può aiutarmi a utilizzare una corrispondenza regolare per formare una matrice di tutte le stringhe che corrispondono a un’espressione regolare in una stringa specifica? Grazie!

( La risposta di 4castle è migliore del sotto se puoi assumere Java> = 9)

Devi creare un matcher e usarlo per trovare le corrispondenze in modo iterativo.

import java.util.regex.Matcher; import java.util.regex.Pattern; ... List allMatches = new ArrayList(); Matcher m = Pattern.compile("your regular expression here") .matcher(yourStringHere); while (m.find()) { allMatches.add(m.group()); } 

Dopo questo, allMatches contiene le corrispondenze e puoi utilizzare allMatches.toArray(new String[0]) per ottenere un array se ne hai davvero bisogno.


È inoltre ansible utilizzare MatchResult per scrivere le funzioni di supporto per eseguire il loop delle corrispondenze poiché Matcher.toMatchResult() restituisce un’istantanea dello stato corrente del gruppo.

Ad esempio puoi scrivere un iteratore pigro per permetterti di farlo

 for (MatchResult match : allMatches(pattern, input)) { // Use match, and maybe break without doing the work to find all possible matches. } 

facendo qualcosa del genere:

 public static Iterable allMatches( final Pattern p, final CharSequence input) { return new Iterable() { public Iterator iterator() { return new Iterator() { // Use a matcher internally. final Matcher matcher = p.matcher(input); // Keep a match around that supports any interleaving of hasNext/next calls. MatchResult pending; public boolean hasNext() { // Lazily fill pending, and avoid calling find() multiple times if the // clients call hasNext() repeatedly before sampling via next(). if (pending == null && matcher.find()) { pending = matcher.toMatchResult(); } return pending != null; } public MatchResult next() { // Fill pending if necessary (as when clients call next() without // checking hasNext()), throw if not possible. if (!hasNext()) { throw new NoSuchElementException(); } // Consume pending so next call to hasNext() does a find(). MatchResult next = pending; pending = null; return next; } /** Required to satisfy the interface, but unsupported. */ public void remove() { throw new UnsupportedOperationException(); } }; } }; } 

Con questo,

 for (MatchResult match : allMatches(Pattern.compile("[abc]"), "abracadabra")) { System.out.println(match.group() + " at " + match.start()); } 

i rendimenti

 a at 0 b at 1 a at 3 c at 4 a at 5 a at 7 b at 8 a at 10 

Java rende l’espressione regolare troppo complicata e non segue lo stile perl. Dai un’occhiata a MentaRegex per vedere come puoi farlo in una singola riga di codice Java:

 String[] matches = match("aa11bb22", "/(\\d+)/g" ); // => ["11", "22"] 

In Java 9, ora puoi utilizzare Matcher#results() per ottenere uno Stream che puoi usare per ottenere una lista / matrice di corrispondenze.

 import java.util.regex.Pattern; import java.util.regex.MatchResult; 
 String[] matches = Pattern.compile("your regex here") .matcher("string to search from here") .results() .map(MatchResult::group) .toArray(String[]::new); // or .collect(Collectors.toList()) 

Ecco un semplice esempio:

 Pattern pattern = Pattern.compile(regexPattern); List list = new ArrayList(); Matcher m = pattern.matcher(input); while (m.find()) { list.add(m.group()); } 

(se hai più gruppi di cattura, puoi fare riferimento ad essi dal loro indice come argomento del metodo di list.toArray() hai bisogno di un array, usa list.toArray() )

Dai percorsi ufficiali di Regex Java :

  Pattern pattern = Pattern.compile(console.readLine("%nEnter your regex: ")); Matcher matcher = pattern.matcher(console.readLine("Enter input string to search: ")); boolean found = false; while (matcher.find()) { console.format("I found the text \"%s\" starting at " + "index %d and ending at index %d.%n", matcher.group(), matcher.start(), matcher.end()); found = true; } 

Usa find e inserisci il group risultante nel tuo array / Elenco / qualsiasi cosa.

  Set keyList = new HashSet(); Pattern regex = Pattern.compile("#\\{(.*?)\\}"); Matcher matcher = regex.matcher("Content goes here"); while(matcher.find()) { keyList.add(matcher.group(1)); } return keyList;