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

195
Vistas
Javascript Regex para convertir de primera a segunda persona usando varias palabras en un diccionario

Estoy escribiendo una función Javascript para convertir una oración de primera persona a segunda persona. Mi función de prueba actual es la siguiente:

 function statementCreator() { var sentence = "I went to the movies with my friend, Sally. Sally says that I'm her best friend."; var transforms = { "I" : "YOU", "ME" : "YOU", "MY" : "YOUR", "AM" : "ARE", "MINE" : "YOURS", "I'M" : "YOU'RE" }; var pattern = `\\b(?:${Object.keys(transforms).join('|')})\\b`; var re = new RegExp(pattern, "g"); str = sentence.toUpperCase().replace(re, matched => transforms[matched]); console.log(str); }

Esto crea el siguiente patrón de expresiones regulares:

 /\b(?:I|ME|MY|AM|MINE|I'M)\b/g

Lo que produce la siguiente salida:

 YOU WENT TO THE MOVIES WITH YOUR FRIEND, SALLY. SALLY SAYS THAT YOU'M HER BEST FRIEND.

Soy muy nuevo en Javascript y, por lo tanto, esta es probablemente una manera terrible de hacer esto y, por supuesto, esto también me deja con la palabra YOU'M como parte de mi salida.

Pero, idealmente, me gustaría una solución que pudiera:

  • Permítanme agregar nuevas entradas en el diccionario y se agregarán a los reemplazos (como se hizo aquí con la ${Object.keys(transforms).join('|')} )
  • Obviamente, ser capaz de manejar entradas como I'M .

¿Cuál sería una buena manera de hacer esto y, en caso de que alguien conozca una forma completamente diferente en la que podría cambiar fácilmente de la primera a la segunda persona más fácilmente / correctamente, ME ENCANTARÁ esa respuesta también?

¡Gracias!

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

0

Los límites de palabras no darán el resultado correcto porque tiene caracteres que no son palabras como ' en I'M y dado I se coloca antes de I'M en alternancia \bI\b satisface la coincidencia en I'm y lo convierte en YOU'm .

Para abordar esto, puede usar esta solución con un enfoque ligeramente diferente en expresiones regulares, es decir

 (?<!\w)(?:I|ME|MY|AM|MINE|I'M)(?![\w'])

Demostración RegEx

  • (?<!\w) : Lookbehind negativo para asegurarnos de que no tenemos un carácter de palabra antes de la coincidencia
  • (?![\w']) : Negative Lookahead para asegurarnos de que no tenemos un carácter de palabra o ' después de la coincidencia

Código:

 function statementCreator() { var sentence = "I went to the movies with my friend, Sally. Sally says that I'm her best friend. I, the current narrator, went to the movies."; var transforms = { "I" : "YOU", "ME" : "YOU", "MY" : "YOUR", "AM" : "ARE", "MINE" : "YOURS", "I'M" : "YOU'RE" }; var pattern = `(?<!\\w)(?:${Object.keys(transforms).join('|')})(?![\\w'])`; var re = new RegExp(pattern, "ig"); str = sentence.toUpperCase().replace(re, matched => transforms[matched]); console.log(str); } statementCreator();

about 4 years ago · Juan Pablo Isaza Denunciar

0

Si bien los límites de espacio en blanco funcionarán cuando esté seguro de que sus palabras siempre están entre caracteres de espacio en blanco o el inicio/final de la cadena, una solución más universal en este caso es simplemente ordenar las claves por longitud en orden descendente antes de crear el patrón de alternancia :

 Object.keys(transforms).sort((a, b) => b.length - a.length)

Esto soluciona el problema porque la primera alternativa encontrada impide que el motor de expresiones regulares pruebe el resto de las alternativas, consulte "Recuerde que el motor de expresiones regulares está ansioso" .

Vea la demostración de JavaScript:

 function statementCreator() { var sentence = "I went to the movies with my friend, Sally. Sally says that I'm her best friend."; var transforms = { "I" : "YOU", "ME" : "YOU", "MY" : "YOUR", "AM" : "ARE", "MINE" : "YOURS", "I'M" : "YOU'RE" }; var keys = Object.keys(transforms).sort((a, b) => b.length - a.length); var pattern = `\\b(?:${keys.join('|')})\\b`; var re = new RegExp(pattern, "g"); str = sentence.toUpperCase().replace(re, matched => transforms[matched]); console.log(str); } statementCreator();

Producción:

 YOU WENT TO THE MOVIES WITH YOUR FRIEND, SALLY. SALLY SAYS THAT YOU'RE HER BEST FRIEND.
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