Estoy creando una página web como un pequeño proyecto divertido mientras aprendo puppeteer y durante ese tiempo me encontré con un pequeño problema cuando se trata de limpiar una cadena para obtener datos útiles . Se me ocurrieron algunos métodos sencillos para obtener los datos que quiero de ellos, pero me encuentro con casos extremos en los que no sé cuál es la mejor manera de manejar las cosas.
Toma esta cuerda
Round 1 - Foo Bar (SchoolName) over John (JC) Cena (Fake School Name) (Fall 1:19)
Los datos que quiero obtener.
Round 1 y el - no me sirven y siguen la misma estructura en toda la aplicación. Por lo tanto, usar el método de simplemente seleccionar el índice donde deberían estar estos elementos debería ser bastante fácil.
El índice más importante de esta cadena es donde se encuentra over . Una vez que lo encuentro, puedo buscar en los índices para encontrar dónde está el resto de la información que necesito.
let findOver = arr.indexOf('over') let winnerName = arr[over - 3].concat(' ', arr[over - 2]) let winnerSchool = summaryBreakUp[over - 1]Esto funciona para la cadena de arriba, al menos para el lado izquierdo. Toma el nombre y apellido de los ganadores y los concatena.
Mi pregunta es cuando la cadena no se ve como el lado izquierdo, ¿cómo considero los casos extremos como el de arriba?
Podría buscar todos los ( && ) y capturar todos los datos en ellos para obtener los School Names pero luego tendría que buscar una forma de averiguar cuál es una escuela y cuál es un apodo.
Cualquier dirección sería apreciada. También publicaré algunos ejemplos más en caso de que alguien más quiera intentarlo.
Esta es una victoria sobre un oponente no especificado.
Michael Macontish (Fairview) over Unknown (For.)
No se da ronda
John Heflin (Arlington) over Random Kid (Mistview) (Fall 1:59)
Sin caída dada
Round 2 - Logan Paul George (High School) over Dontae Inverse (Jackson County) (Dec 3-0)
Use expresiones regulares y grupos de captura para obtener los bits que le interesan, es posible que tenga que hacer algunos arreglos menores más adelante.
Hay muchos patrones que podría usar (y estoy seguro de que este no es el mejor, pero es un comienzo):
([\w\s\(\)]+)\s\(([\s\w\.]+)\)\sover\s([\w\s\(\)]+)\s\(([\s\w\.]+)\)Esto coincide con los nombres como
Seguido de un paréntesis de apertura, seguido de la escuela como
Seguido de un paréntesis cerrado, seguido de un espacio en blanco, luego la palabra "over", un espacio en blanco nuevamente y luego repite el nombre y el patrón de la escuela. Todo lo demás se ignora.
Uso: cuando usa expresiones regulares en javascript, los grupos de captura terminan como elementos en la matriz resultante. La coincidencia completa es el primer elemento y cada elemento adicional representa los grupos de captura en orden. Hay 4 grupos de captura en esta expresión, por lo que terminará con los elementos 1-5 que representan el nombre1, la escuela1, el nombre2 y la escuela2.
const re = /([\w\s\(\)]+)\s\(([\s\w\.]+)\)\sover\s([\w\s\(\)]+)\s\(([\s\w\.]+)\)/ const input = [ 'Round 1 - Foo Bar (SchoolName) over John (JC) Cena (Fake School Name) (Fall 1:19)', 'Michael Macontish (Fairview) over Unknown (For.)', 'John Heflin (Arlington) over Random Kid (Mistview) (Fall 1:59)', 'Round 2 - Logan Paul George (High School) over Dontae Inverse (Jackson County) (Dec 3-0)' ] input.forEach( i => { console.log(i.match(re)) })Como patrón alternativo, puede ampliar el rango con qué hacer coincidir utilizando un punto no codicioso .*? para hacer coincidir cualquier carácter o clase de carácter negado [^ para excluir lo que se permite que coincida.
Comience el patrón haciendo coincidir opcionalmente la parte del principio con - .
Para hacer coincidir la parte correcta entre paréntesis al final, puede afirmar que la parte parte entre paréntesis no tiene - o : entre dígitos usando una búsqueda anticipada negativa.
(?:.*?\s+-\s+)?([^()]+)\s+\(([^()]+)\)\s+over\s+(.*)\s+\((?![^()]*\d[-:]\d[^()]*\))([^()]*)\)El patrón coincide:
(?:.*?\s+-\s+)? Opcionalmente, haga coincidir una parte que termine con <code> - </code>([^()]+) Captura el grupo 1 para que coincida con cualquier carácter excepto ( y )\s+ Combina 1+ caracteres de espacio en blanco\(([^()]+)\) Match ( luego captura cualquier carácter excepto ( y ) en el grupo 2 y Match )Match over` entre 1 o más caracteres de espacio en blanco(.*) Captura cualquier carácter en el grupo 3\s+ Combina 1+ caracteres de espacio en blanco\( Partido ((?![^()]*\d[-:]\d[^()]*\)) Anticipación negativa, afirmar que entre paréntesis no hay : o - entre dígitos([^()]*) Si la afirmación es verdadera, captura cualquier carácter excepto ( y ) en el grupo 4\) Partido )Ver una demostración de expresiones regulares
const regex = /(?:.*?\s+-\s+)?([^()]+)\s+\(([^()]+)\)\s+over\s+(.*)\s+\((?![^()]*\d[-:]\d[^()]*\))([^()\n]*)\)/; [ "Round 1 - Foo Bar (SchoolName) over John (JC) Cena (Fake School Name) (Fall 1:19)", "Michael Macontish (Fairview) over Unknown (For.)", "John Heflin (Arlington) over Random Kid (Mistview) (Fall 1:59)", "Round 2 - Logan Paul George (High School) over Dontae Inverse (Jackson County) (Dec 3-0)" ].forEach(s => console.log(s.match(regex)));