2010-03-08 38 views
233

Domanda di regex semplice. Ho una stringa sul seguente formato:Espressione regolare per estrarre il testo tra parentesi quadre

this is a [sample] string with [some] special words. [another one] 

Qual è l'espressione regolare per estrarre le parole all'interno delle parentesi quadre, ad es.

sample 
some 
another one 

Nota: nel mio caso di utilizzo, le parentesi non possono essere nidificate.

risposta

472

È possibile utilizzare la seguente espressione regolare globalmente:

\[(.*?)\] 

Spiegazione:

  • \[: [ è una meta char e deve essere sfuggito, se si desidera far corrispondere letteralmente.
  • (.*?): abbinare tutto in modo non avido e catturarlo.
  • \]: ] è un metacarattere e deve essere sfuggito se si desidera corrispondere letteralmente.
+6

Il metodo dell'altra risposta, usando '[^]]' è più veloce di non-goloso ('?'), E funziona anche con gli aromi regex che non supportano i non-golosi. Tuttavia, il non-avido sembra più carino. – Ipsquiggle

+0

@Ipsquiggle hai ragione sir :) – StErMi

+92

Come escludere '[' ']' dall'output (risultato)? –

65

Questo dovrebbe funzionare bene:

\[([^]]+)\] 
+3

Nel mio caso d'uso, il testo tra parentesi può includere nuove righe, e questa espressione regolare funziona, mentre la risposta accettata no. – Dave

+1

cosa significa la classe di carattere [^]]? Cosa combacia? – Richard

+2

@Richard, Il^nega la classe di caratteri. Significa "qualsiasi personaggio che non è un]". – jasonbar

28

Può parentesi essere annidati?

In caso contrario: \[([^]]+)\] corrisponde a un elemento, comprese le parentesi quadre. Backreference \1 conterrà l'articolo da abbinare. Se il tuo gusto regex supporta il lookaround, usa

(?<=\[)[^]]+(?=\]) 

Questo corrisponderà solo alla voce tra parentesi.

+0

Questo contrassegna solo la prima occorrenza –

+0

@KunalMukherjee: No, la regex può corrispondere qualsiasi numero di volte. Ma alcuni aromi regex devono essere esplicitamente indicati per applicare ripetutamente l'espressione regolare (ad esempio, usando il flag '/ g' in JavaScript). –

1
([[][a-z \s]+[]]) 

Sopra dovrebbe funzionare dato la seguente spiegazione

  • caratteri tra parentesi quadre [] definisce classe characte che significa modello dovrebbe corrispondere almeno uno charcater citato tra parentesi quadre

  • \ s specifica uno spazio

  • + significa almeno uno del personaggio menzionato in precedenza a +.

+0

Nei casi sensibili 'A-Z' dovrebbe aggiungere al modello:' ([[] [a-zA-Z \ s] + []]) '; Penso che sia un buon modo, mentre '\' nei pattern regex che definiscono i segni di stringa ("e ') e mescolano i principianti con la gestione del backslash in" o "usages! – MohaMad

36
(?<=\[).+?(?=\]) 

catturerà contenuto senza staffe

(< = [?) - lookbehind positivo per [

*.? - corrispondenza non avida per il contenuto

(?=]) - lookahead positivo per [

EDIT: per le staffe nidificate la regex di seguito dovrebbe funzionare:

(\[(?:\[??[^\[]*?\])) 
+2

@igaurav L'ho controllato e funziona. Tuttavia, non funzionerà in ambienti che non supportano lookbehind come JavaScript. Forse è il tuo caso? –

+0

Adam, la soluzione delle parentesi annidate fallisce quando c'è una stringa con un '.' in esso ... – patrick

3

Questo codice sarà estrarre il contenuto tra parentesi quadre e parentesi

(?:(?<=\().+?(?=\))|(?<=\[).+?(?=\])) 

(?: non capturing group 
(?<=\().+?(?=\)) positive lookbehind and lookahead to extract the text between parentheses 
| or 
(?<=\[).+?(?=\]) positive lookbehind and lookahead to extract the text between square brackets 
6

(?<=\().*?(?=\)) opere buono come da spiegazione sopra. Ecco un esempio di Python:

import re 
str = "Pagination.go('formPagination_bottom',2,'Page',true,'1',null,'2013')" 
re.search('(?<=\().*?(?=\))', str).group() 
"'formPagination_bottom',2,'Page',true,'1',null,'2013'" 
+1

Dovresti sempre usare la formattazione del codice per le espressioni regolari, ovunque appaiano. Se la regex è nel testo anziché in un blocco di codice, puoi utilizzare i backtick per formattarli. ([ref] (http://stackoverflow.com/editing-help#comment-formatting)) –

+0

Inoltre, la domanda riguardava parentesi quadre ('[]'), non parentesi. –

Problemi correlati