2011-11-10 11 views
6

Come posso risolvere questo problema di regex Java?Regex: come catturarlo? (un gruppo nidificato all'interno di un gruppo ripetuto)

ingresso:

some heading text... ["fds afsa","fwr23423","42df f","1a_4([email protected]#","3240acg!g"] some trailing text....

Problema: Vorrei catturare tutto tra le virgolette. (Esempio: fds AFSA, fwr23423, ecc)

Ho provato il seguente schema:

\[(?:"([^"]+)",?)+\]

Ma quando si esegue una Matcher.find(), il risultato sarà una StackOverflowError, quando si utilizza un input più grande (ma funziona per un piccolo input, questo è un bug in Java). E anche se funzionasse, matcher.group (1) darà solo "3240acg! G".

Come posso risolvere questo problema? (Oppure è necessario l'uso di più schemi, in cui il primo motivo rimuove le parentesi?)

risposta

1

Ottenere una stringa tra [ ] e quindi dividere con una virgola. È molto più facile

1

tre suggerimenti:

Se stringhe solo possono verificarsi tra parentesi, allora non c'è bisogno di verificare la presenza di loro a tutti e basta usare "[^"]*" come espressione regolare e trovare tutte le partite (supponendo che non sfuggì virgolette).

Se ciò non funziona perché le stringhe potrebbero verificarsi anche in altri luoghi, dove non si desidera catturarle, farlo in due passaggi.

  1. Partita \[[^\]]*\].
  2. Trova tutte le occorrenze di "[^"]*" all'interno del risultato della prima partita. O anche usare un parser JSON per leggere quella stringa.

terza possibilità, barare un po ':

Cerca "[^"\[\]]*"(?=[^\[\]]*\]). Ciò corrisponderà a una stringa solo se la parentesi successiva che segue è una parentesi chiusa. Limitazione: nessuna parentesi è consentita all'interno delle stringhe. Considero questo brutto, soprattutto se si guarda a come sarebbe simile a Java:

List<String> matchList = new ArrayList<String>(); 
Pattern regex = Pattern.compile("\"[^\"\\[\\]]*\"(?=[^\\[\\]]*\\])"); 
Matcher regexMatcher = regex.matcher(subjectString); 
while (regexMatcher.find()) { 
    matchList.add(regexMatcher.group()); 
} 

Pensi che qualcuno che guarda a questo in pochi mesi può dire che cosa sta facendo?

+0

Quindi sono necessari più schemi/corrispondenze. Ho trovato qualcosa di simile qui: http://answers.oreilly.com/topic/222-how-to-find-a-match-within-another-match-in-a-regular-expression/ – Devabc

+0

Bene, OK, lì è un altro modo, ma non penso che sia un buon modo. L'ho aggiunto alla mia risposta. –

Problemi correlati