Regex para obtener una cadena entre llaves

6 minutos de lectura

Regex para obtener una cadena entre llaves
cristiancambo

Desafortunadamente, a pesar de haber intentado aprender expresiones regulares al menos una vez al año durante tantos años como puedo recordar, siempre las olvido porque las uso con poca frecuencia. Este año, mi resolución de año nuevo es no volver a intentar aprender expresiones regulares: Así que este año para salvarme de las lágrimas se lo daré a Stack Overflow. (Remix de Las últimas Navidades).

Quiero pasar una cadena en este formato. {getThis}y se devolverá la cadena getThis. ¿Alguien podría ayudarme a cumplir mi resolución de año nuevo?


Preguntas relacionadas sobre Stack Overflow:

  • ¿Cómo se pueden convertir las comillas regulares (es decir, ‘, “) en comillas LaTeX/TeX (es decir, `’, “”)
  • Regex: para extraer una subcadena entre dos etiquetas en una cadena
  • Regex para reemplazar todo \n en una cadena, pero no los que están dentro [code] [/code] etiqueta

  • Esta pregunta se agregó a las Preguntas frecuentes sobre expresiones regulares de desbordamiento de pila, en “Advanced Regex-Fu”.

    – una mente literal

    10 de abril de 2014 a las 1:36


  • @Kobi: Las preguntas frecuentes son una wiki. Cualquiera puede editarlo. Así que edítalo.

    – una mente literal

    26 de abril de 2014 a las 11:33

Tratar

/{(.*?)}/

Eso significa, haga coincidir cualquier carácter entre { y }, pero no sea codicioso: haga coincidir la cadena más corta que termina con } (el ? deja de ser codicioso). Los paréntesis le permiten extraer la parte coincidente.

Otra forma sería

/{([^}]*)}/

Esto coincide con cualquier carácter excepto un carácter } (otra forma de no ser codicioso)

  • esto es excelente, pero ¿es posible hacer coincidir algo entre un número variable de combinaciones de corchetes? Por ejemplo: “{esto debería coincidir}esto no debería{esto debería volver a aparecer}y así {en}”? Me gustaría recuperar el valor, que no está entre llaves. Además: los corchetes no se utilizarán en la oración y no se apilarán (esto nunca ocurriría: “{some {text}}”). ¿Alguien tiene una idea de cómo hacerlo :)? ¡Gracias! (pd: voté a favor de esta solución)

    – Igor

    26 mayo 2013 a las 17:22

  • No captura todo entre las llaves, captura todo entre las llaves Y las mismas llaves. ¿Cómo harías para capturar SOLAMENTE lo que está dentro de las llaves?

    – Realidad-Torrent

    19 de enero de 2016 a las 12:40

  • Me gusta que no necesites escapar de las llaves aquí, ya que el analizador de expresiones regulares parece darse cuenta de que no son un cuantificador… bueno, estoy haciendo esto en Python, pero supongo que las expresiones regulares de JavaScript funcionan así. también

    – drevicko

    10 de febrero de 2016 a las 12:26

  • Agregar un g al final lo convierte en una búsqueda global. Ver un ejemplo de trabajo

    – Benjamín

    5 de julio de 2016 a las 15:56

  • @ Reality-Torrent, también vi que capturó los corchetes si especifico la opción g para obtener todas las coincidencias. Resulta que debería usar Regex.exec en un bucle en lugar de string.match en Javascript para tener tanto el indicador g como permitir el grupo de captura. Ver desarrollador.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

    – franco

    23 de julio de 2019 a las 20:39

Regex para obtener una cadena entre llaves
miau

/\{([^}]+)\}/

/        - delimiter
\{       - opening literal brace escaped because it is a special character used for quantifiers eg {2,3}
(        - start capturing
[^}]     - character class consisting of
    ^    - not
    }    - a closing brace (no escaping necessary because special characters in a character class are different)
+        - one or more of the character class
)        - end capturing
\}       - the closing literal brace
/        - delimiter

  • @meouw sa = s.split(“/\{([^}]+)\}/”); da un error de compilación. repetición ilegal, carácter de escape no válido.

    – como judo

    26 de diciembre de 2012 a las 0:22

  • @Anil parece estar usando una cadena como argumento dividido en lugar de una expresión regular. ¿Que estás tratando de hacer?

    – miau

    26 de diciembre de 2012 a las 22:09

  • Muy clara y útil, esta debe ser la respuesta más votada.

    – Daniel Rch.

    21 de febrero a las 2:20

1646753053 130 Regex para obtener una cadena entre llaves
Kev

Si su cadena siempre tendrá ese formato, una expresión regular es una exageración:

>>> var g='{getThis}';
>>> g.substring(1,g.length-1)
"getThis"

substring(1 significa comenzar un carácter en (justo después del primer {) y ,g.length-1) significa tomar caracteres hasta (pero sin incluir) el carácter en la longitud de la cadena menos uno. Esto funciona porque la posición está basada en cero, es decir g.length-1 es la última posición.

Para lectores que no sean el cartel original: Si posee para ser una expresión regular, use /{([^}]*)}/ si desea permitir cadenas vacías, o /{([^}]+)}/ si solo desea hacer coincidir cuando hay al menos un carácter entre las llaves. Desglose:

  • /: iniciar el patrón de expresiones regulares
    • {: una llave literalmente
      • (: empezar a capturar
        • [: start defining a class of characters to capture
          • ^}: “anything other than }
        • ]: OK, esa es nuestra definición de clase completa
        • *: cualquier número de caracteres que coincidan con la clase que acabamos de definir
      • ): termine de capturar
    • }: una llave literal debe seguir inmediatamente lo que capturamos
  • /: finaliza el patrón de expresión regular

  • La subcadena es una de esas cosas que cambia según el idioma en el que trabaja. Javascript toma el índice para detenerse, PHP toma la longitud del resultado final deseado (a menos que sea negativo, en cuyo caso toma la cantidad de caracteres para eliminar) , C# vuelve a ser diferente… bonito y confuso.

    – jvenema

    26 de enero de 2010 a las 0:55


  • … y Python solo tiene corte, que en mi opinión es mejor que cualquier otra cosa: p.

    – Grant Paul

    3 de marzo de 2010 a las 6:25

  • Dulce, pero no estoy seguro de cómo eso es una expresión regular. Tal vez estaba pidiendo expresiones regulares, y vine aquí por la misma respuesta… lamentablemente, la respuesta no tiene nada que ver con la pregunta…

    – baash05

    30 de noviembre de 2011 a las 0:04

  • @ baash05, si lee la pregunta completa, el OP ni siquiera quería aprender expresiones regulares, por lo que no creo que sea el ejercicio académico que parece sugerir que era.

    – Kev

    7 dic 2011 a las 16:50

  • Quería hacer -1 porque la pregunta pide expresiones regularesestaba buscando expresiones regulares, pero la respuesta aceptada fue completamente inútil para mí (mientras que la pregunta parecía muy prometedora). Después de leer el primer comentario, debo admitir que si tuviera que responder esta pregunta primero, podría haber respondido de la misma manera/similar… Así que al final, +1.

    – Shadyyx

    4 de julio de 2014 a las 8:14


Regex para obtener una cadena entre llaves
Mohamed Abo Elmagd

Prueba esto:

/[^{\}]+(?=})/g

Por ejemplo

Welcome to RegExr v2.1 by #{gskinner.com},  #{ssd.sd} hosted by Media Temple!

regresará gskinner.com, ssd.sd.

1646753055 373 Regex para obtener una cadena entre llaves
campana

Aquí hay una solución simple usando javascript replace

var st="{getThis}";

st = st.replace(/\{|\}/gi,''); // "getThis"

Como la respuesta aceptada anterior señala que el problema original se resuelve fácilmente con una subcadena, pero usar reemplazar puede resolver los casos de uso más complicados

Si tiene una cadena como “randomstring999[fieldname]”Usas un patrón ligeramente diferente para obtener el nombre del campo

var nameAttr = "randomstring999[fieldname]";

var justName = nameAttr.replace(/.*\[|\]/gi,''); // "fieldname"

1646753055 52 Regex para obtener una cadena entre llaves
Hemadri Dasari

Prueba esto

let path = "/{id}/{name}/{age}";
const paramsPattern = /[^{\}]+(?=})/g;
let extractParams = path.match(paramsPattern);
console.log("extractParams", extractParams) // prints all the names between {} = ["id", "name", "age"]

1646753056 702 Regex para obtener una cadena entre llaves
Alex Kessaris

Este funciona en Textmate y coincide con todo en un archivo CSS entre llaves.

\{(\s*?.*?)*?\}


selector {.
.
matches here
including white space.
.
.}

Si desea poder devolver el contenido, envuélvalo todo en un par de paréntesis más como este:

\{((\s*?.*?)*?)\}

y puede acceder a los contenidos a través de $1.

Esto también funciona para funciones, pero no lo he probado con corchetes anidados.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad