Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

427
Visualizações
¿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 Respostas
Responde à pergunta

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 Relatório

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda