2010-09-09 25 views
6

Necesito encontrar la expresión regular para []expresión regular para cualquier cosa entre []

Por ejemplo, si la cadena es - Hola [Pila], aquí está mi [etiqueta], que tengo que [Buscar].

Debe devolver Pila, Tag, Encuentra

+1

¿Sobre qué plataforma? ¿En qué lenguaje de programación? –

+0

asp.net. Estoy usando Regex.IsMatch() – Ankit

+2

¿Puede haber coincidencias anidadas: 'foo [bar [baz]] done' en las que desea tomar' bar [baz] '? O tal vez 'foo [bar \\] baz] done' donde quieras agarrar' bar] baz'? ¿Puede haber nuevas líneas entre '[' y ']'? –

Respuesta

26

Bastante simple, sólo tiene que (1) escapar de los soportes con barras invertidas, y (2) el uso (.*?) para capturar el contenido.

\[(.*?)\] 

Los paréntesis son un grupo de captura, capturan sus contenidos para su uso posterior. El signo de interrogación después de .* hace que la coincidencia no sea codiciosa. Esto significa que coincidirá con la coincidencia más corta posible, en lugar de la más larga. La diferencia entre codicioso y no expansivo surge cuando se tienen varios partidos en una línea:

Hi [Stack], Here is my [Tag] which i need to [Find]. 
    ^______________________________________________^ 

Un partido codicioso encontrará la cadena más larga posible entre dos pares de corchetes. Eso no está bien. Un partido no expansivo encontrará la más corta:

Hi [Stack], Here is my [Tag] which i need to [Find]. 
    ^_____^ 

De todas formas, el código va a terminar looking like:

string regex = @"\[(.*?)\]"; 
string text = "Hi [Stack], Here is my [Tag] which i need to [Find]."; 

foreach (Match match in Regex.Matches(text, regex)) 
{ 
    Console.WriteLine("Found {0}", match.Groups[1].Value); 
} 
3
\[([\w]+?)\] 

debería funcionar. Es posible que deba cambiar el grupo coincidente si necesita incluir caracteres especiales también.

+0

Esto funciona un poco más agradable que la respuesta Actualmente etiquetado, ya que tiene un mejor control sobre cosas como esta: "Test [prueba] [prueba [test]" La respuesta etiquetado incluirá la perdida [en el partido, mientras que esta expresión regular no lo hará . – StronglyTyped

3

Dependiendo de qué ambiente decir:

\[([^\]]+)] 
+0

Ah, .NET ... Esta fue una expresión regular de Emacs. :-) –

+1

Creo que te perdiste un ']' incluso en la sintaxis de Emacs. – kennytm

+1

Me tomé la libertad de cambiarlo por uno compatible con .NET. Tenga en cuenta que '' 'solo necesita escaparse dentro del conjunto de caracteres, no fuera de él (aunque no hace daño escapar de él ...). –

0

sintaxis .NET, el cuidado de múltiples soportes embebidos:

\[ ((?: \\. | (?<OPEN> \[) | (?<-OPEN> \]) | [^\]])*? (?(OPEN)(?!))) \]

Esta cuenta el número de secciones abiertas [ en OPEN y sólo tiene éxito si OPEN es 0 al final.

Cuestiones relacionadas