Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

430
Vistas
¿Puede alguien ayudarme con esta expresión regular de javascript para convertir una cadena de elementos de la lista en una matriz con solo los textos del elemento (sin número de elemento de la lista o nueva línea)?

Tengo 2 tipos de cadenas que regresan de una API. Se ven de la siguiente manera:

 let string1 = "\n1. foo\n2. bar\n3. foobar" let string2 = "\n\n1. foo.\n\n2. bar.\n\n3. foobar."

Para ser claros, la cadena 1 siempre tendrá 3 elementos que regresan, la cadena 2 tiene un número desconocido de elementos que regresan. Pero patrones muy similares.

Lo que quiero hacer es extraer el texto solo de cada elemento en una matriz.

Así que de string1 quiero ["foo", "bar", "foobar"] De string2 quiero ["foo.", "bar.", "foobar."]

Soy terrible con las expresiones regulares, pero de alguna manera me topé con una expresión que logra esto para ambos tipos de cadenas, sin embargo, utiliza la búsqueda de expresiones regulares que estoy tratando de evitar, ya que no es compatible con todos los navegadores:

 let regex = /(?<=\. )(.*[a-zA-Z])/g; let resultArray = str.match(regex);

¿Alguien podría ayudarme a refactorizar esta expresión regular en algo que no use mirar atrás?

about 4 years ago · Juan Pablo Isaza
3 Respuestas
Responde la pregunta

0

Algunas notas sobre el patrón (?<=\. )(.*[a-zA-Z]) que probaste:

  • La primera parte afirma un punto y un espacio a la izquierda, pero no tiene en cuenta los saltos de línea, por lo que también podría coincidir en otras posiciones.

  • No tiene en cuenta los dígitos para hacer coincidir un elemento de la lista.

  • La segunda parte de su patrón coincide hasta la última aparición de un carácter A-Za-z que no coincide con el punto final en los ejemplos en string2


Todas sus cadenas de ejemplo comienzan con una nueva línea, un número, un punto y uno o más espacios.

Puede obtener las coincidencias sin utilizar una búsqueda posterior y hacer que el patrón sea más específico iniciando la coincidencia con el formato de elemento de lista.

Luego capture el resto de la línea después de ella en un grupo de captura.

 \n\d+\.[^\S\r\n]+(.+)

Explicación

  • \n Coincidir con una nueva línea
  • \d+\. Coincide con 1+ dígitos y un punto
  • [^\S\r\n]+ Combina 1 o más espacios sin líneas nuevas
  • (.+) Capturar grupo 1, emparejar 1 o más caracteres

Vea una demostración de expresiones regulares .

 const regex = /\n\d+\.[^\S\r\n]+(.+)/g; [ "\n1. foo\n2. bar\n3. foobar", "\n\n1. foo.\n\n2. bar.\n\n3. foobar." ].forEach(s => { console.log(Array.from(s.matchAll(regex), m => m[1])) });


Si la cadena también debe coincidir sin una nueva línea inicial, puede usar un ancla ^ para afirmar el inicio de la cadena y usar la bandera multilínea /m

 const regex = /^\d+\.[^\S\r\n]+(.+)/gm; [ "1. foo\n2. bar\n3. foobar", "1. foo.\n\n2. bar.\n\n3. foobar." ].forEach(s => { console.log(Array.from(s.matchAll(regex), m => m[1])) });

about 4 years ago · Juan Pablo Isaza Denunciar

0

El código de OP, que usa un String.match , en realidad es mejor que las soluciones propuestas. Solo necesitaba un ajuste menor para que funcionara, que es lo que preguntaba la pregunta:

 string1.match(/([Az].+)/g) 

 // TEST [ "\n1. foo\n2. bar\n3. foobar", "\n\n1. foo.\n\n2. bar.\n\n3. foobar." ].forEach(p => { console.log( p.match(/([Az].+)/g) ) });

about 4 years ago · Juan Pablo Isaza Denunciar

0

EDITAR: vea la solución de @ Oleg-Barabanov, técnicamente es un poco más rápido.

 string.replace(/\n[0-9.]*/g, "").split(" ").slice(1)
  • \n para la nueva línea
  • 0-9 para dígitos (también podría usar \d
  • . para el punto después del número
  • g para reemplazar todo
  • .split(" ") para cortarlo donde haya un espacio ( \s )

Manifestación:

 let string1 = "\n1. foo\n2. bar\n3. foobar" let string2 = "\n\n1. foo.\n\n2. bar.\n\n3. foobar." const parse = (str) => str.replace(/\n[0-9.]*/g, "").split(" ").slice(1) console.log(parse(string1)) console.log(parse(string2))

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda