Espressione regolare per trovare una stringa inclusa tra due caratteri mentre ESCLUDE i delimitatori

Ho bisogno di estrarre da una stringa un insieme di caratteri che sono inclusi tra due delimitatori, senza restituire i delimitatori stessi.

Un semplice esempio dovrebbe essere utile:

Target : estrae la sottostringa tra parentesi quadre, senza restituire le parentesi stesse.

Stringa di base : questa è una stringa di prova [più o meno]

Se uso il seguente reg. ex.

  \ [. *? \] 

La partita è [più o meno] . Ho bisogno di ottenere solo più o meno (senza parentesi).

È ansible farlo?

Facile da fare:

(?<=\[)(.*?)(?=\]) 

Tecnicamente sta usando lookaheads e lookbehinds. Vedi Lookahead e Lookbehind Zero-Width Assertions . Il modello consiste di:

  • è preceduto da un [che non è catturato (guarda dietro);
  • un gruppo catturato non avido. Non è avido fermarsi al primo]; e
  • è seguito da un] che non viene catturato (lookahead).

In alternativa puoi semplicemente catturare cosa c'è tra le parentesi quadre:

 \[(.*?)\] 

e restituire il primo gruppo catturato invece dell'intera partita.

Se si utilizza JavaScript , la prima soluzione fornita da cletus, (?<=\[)(.*?)(?=\]) , Non funzionerà perché JavaScript non supporta l'operatore lookbehind.

Tuttavia, la seconda soluzione funziona bene, ma è necessario ottenere il secondo elemento corrispondente.

Esempio:

 var regex = /\[(.*?)\]/; var strToMatch = "This is a test string [more or less]"; var matched = regex.exec(strToMatch); 

Tornerà:

 ["[more or less]", "more or less"] 

Quindi, quello di cui hai bisogno è il secondo valore. Uso:

 var matched = regex.exec(strToMatch)[1]; 

Ritornare:

 "more or less" 

Hai solo bisogno di ‘catturare’ il bit tra le parentesi.

 \[(.*?)\] 

Per catturarlo mettilo tra parentesi. Non dici quale lingua sta usando. Ad esempio, in Perl si accederà a questo utilizzando la variabile $ 1.

 my $string ='This is the match [more or less]'; $string =~ /\[(.*?)\]/; print "match:$1\n"; 

Altre lingue avranno meccanismi diversi. C #, ad esempio, utilizza la class di raccolta Match , credo.

PHP:

 $string ='This is the match [more or less]'; preg_match('#\[(.*)\]#', $string, $match); var_dump($match[1]); 

Per rimuovere anche l’uso []:

 \[.+\] 

[^\[] Trova qualsiasi carattere che non sia [.

+ Abbina 1 o più di tutto ciò che non è [ . Crea gruppi di queste partite.

(?=\]) Aspetto positivo ] . Corrisponde a un gruppo che termina con ] senza includerlo nel risultato.

Fatto.

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

Prova.

http://regexr.com/3gobr

Simile alla soluzione proposta da null. Ma l’ulteriore \] non è richiesto. Come nota aggiuntiva, appare \ non è richiesto per uscire dal [ dopo il ^ . Per la leggibilità, vorrei lasciarlo dentro

Non funziona nella situazione in cui i delimitatori sono identici. "more or less" per esempio.

Ho avuto lo stesso problema usando regex con bash scripting. Ho usato una soluzione in 2 fasi usando pipe con grep -o application

  '\[(.*?)\]' 

prima poi

 '\b.*\b' 

Ovviamente non altrettanto efficiente alle altre risposte, ma un’alternativa.

Questo in particolare funziona per il parser di espressioni regolari di javascript /[^[\]]+(?=])/g

basta eseguirlo nella console

 var regex = /[^[\]]+(?=])/g; var str = "This is a test string [more or less]"; var match = regex.exec(str); match; 

Volevo trovare una stringa tra / e #, ma # a volte è opzionale. Ecco la regex che uso:

  (?<=\/)([^#]+)(?=#*) 

Se è necessario estrarre il testo senza parentesi, è ansible utilizzare bash awk

echo " [hola mundo] " | awk -F'[][]' '{print $2}'

risultato:

hola mundo