2009-10-12 111 views
25

Estoy buscando un patrón de expresión regular que me devolverá el contenido del primer conjunto de paréntesis en una cadena.Patrón Regex para devolver texto entre paréntesis

Por ejemplo,

text text text text (hello) text (hello2) (hello3) text 

volverá "hello"

¿Alguien sabe lo que el diagrama de radiación tiene para C#?

+1

Solicitud de cambio de titular. ¿No debería usarse la palabra 'corchete' para '[' y no a '(' (paréntesis)? - crokusek – crokusek

Respuesta

59

El patrón de expresión regular sería algo como esto:

\(([^)]*)\) 

patrón de la autopsia:

\( - un literal "("

( - inicio del sub-patrón:

[^)]* partido 0 o más caracteres que no son ")" - nota: estamos definiendo un grupo de caracteres, por lo que no tenemos que escapar del carácter ) aquí.

) - final del sub-patrón

\) - un literal ")"

El patrón completo coincidirán con los soportes y el texto dentro de ellos, el primer sub-patrón coincidirá con sólo el texto dentro de los corchetes (ver referencia de C# cómo obtenerlos - no hablo C#;))

+1

¿Se puede adaptar esto para que no devuelvan los corchetes? ¿Solo el contenido? – Grant

+2

Me parece correcto. un carácter real '(', luego comience un grupo, luego haga coincidir cero o más caracteres que no sean '' '), luego cierre el grupo y luego haga coincidir un carácter' '' 'real. El grupo resultante debería obtener exactamente lo que estaba dentro de los parens. Este ejemplo es un poco confuso porque el personaje para comenzar un grupo simplemente es '(' y estamos buscando una coincidencia real '('. Para desactivar la 'magia' del '(' personaje y simplemente hacer coincidir un real ') ('carácter, ponemos una barra invertida primero, como "\\ (", como se muestra aquí. – steveha

+0

Esto no devuelve los corchetes. –

2

expresiones regulares desnudo:

\((.*?)\) 

En Python se puede utilizar de esta manera:

import re 

rx = re.compile(r'\((.*?)\)') 
s = 'text text text text (hello) text (hello2) (hello3) text' 
rxx = rx.search(s) 
if rxx: 
    print(rxx.group(1)) 
+0

¿No sería python regex hacer concordancia codiciosa aquí? Devolviendo '(hello) text (hello2) (hello3)' como la primera y única coincidencia? –

+0

Bien, la expresión ". *?" es una versión no codiciosa de ". *" en Python. ¿Funciona también en C#? – steveha

+0

Hmm, el truco no codicioso probablemente funciona en C#, ver "Coincidencia vaga y codiciosa" en esta página: http://www.dijksterhuis.org/expresiones-regulares-en-cifras-de-las-clases/ – steveha

1

Si las cadenas son relativamente pequeñas, se puede utilizar un reemplazar en lugar de un partido:

string s = Regex.Replace("text text text text (hello) text (hello2) (hello3) text", @"^.*?\(([^)]*)\).*$", "$1"); 
5

Esto le devolverá solo lo que está dentro del primer conjunto de corchetes:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Text.RegularExpressions; 

namespace Test 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Match match = Regex.Match("foo bar (first) foo bar (second) foo", @"\((.*?)\)"); 

      if (match.Groups.Count > 1) 
      { 
       string value = match.Groups[1].Value; 
       System.Console.WriteLine(value); 
      } 
     } 
    } 
} 
Cuestiones relacionadas