Tengo una variedad de objetos que son artistas musicales en Javascript. Estoy tratando de construir una expresión regular para seleccionar los artistas que comienzan con una letra seleccionada. Sin embargo, necesito excluir "the" y "a" en cada cadena de nombre de artista mientras sigo considerando el carácter inicial para el resto de la cadena.

Hasta ahora, esto es lo más cerca que puedo:

/(?!^the |^a )\b${indexCharacter}?/i

No he implementado $ {indexCharacter} todavía, solo me estaba enfocando en usar ^ r en su lugar con un caso de prueba de "The Rolling Stones" para probarlo.

Así que funcionó y pensé en probarlo en la cuerda "The Mighty Mighty Bostones" y agarra la 1ª y 2ª "M". Estoy cerca, simplemente no puedo imaginar cómo hacer que se detenga en la primera instancia. Pensé que el signo de interrogación lo haría.

Definitivamente hay una manera de hacer esto. ¿Ayuda por favor?

0
Drew Peterson 7671 3 mar. 2021 a las 11:02

3 respuestas

La mejor respuesta

Aquí hay un caso de prueba basado en su descripción:

const artists = [
  { name: 'The Rolling Stones', stars: 5 },
  { name: 'Santana', stars: 5 },
  { name: 'Queen', stars: 4 },
  { name: 'The Beatles', stars: 3 },
  { name: 'Jimi Hendrix', stars: 5 },
  { name: 'Joe Cocker', stars: 3 },
  { name: 'Pink Floyd', stars: 5 },
  { name: 'Rammstein', stars: 5 },
  { name: 'The Clash', stars: 2 },
  { name: 'The Cure', stars: 2 },
  { name: 'The Damned', stars: 3 },
  { name: 'Tool', stars: 2 },
  { name: 'A Perfect Circle', stars: 1 },
  { name: 'Alice Cooper', stars: 4 },
];

function findArtists(query) {
  return artists.filter(a => {
    let re = new RegExp('^' + query.toLowerCase());
    return re.test(a.name.toLowerCase().replace(/^((a|the)\s)/, ''));
  });
}

[ 'a', 'j', 'ji', 'r', 't' ].forEach(query => {
  let result = findArtists(query);
  console.log('- query: ' + query + ' => ' + JSON.stringify(result));
});

Salida:

- query: a => [{"name":"Alice Cooper","stars":4}]
- query: j => [{"name":"Jimi Hendrix","stars":5},{"name":"Joe Cocker","stars":3}]
- query: ji => [{"name":"Jimi Hendrix","stars":5}]
- query: r => [{"name":"The Rolling Stones","stars":5},{"name":"Rammstein","stars":5}]
- query: t => [{"name":"Tool","stars":2}]

Explicación de regex new RegExp('^((a|the)\\s)?' + query.toLowerCase())

  • ^ - inicio de cadena
  • (: grupo de inicio 1 (podría convertirlo en un grupo (?:...) que no captura)
    • (a|the): grupo para a o the
    • \\s: seguido de un espacio (doble barra invertida debido a la cadena)
  • )? - grupo final 1, ? lo hace opcional
  • seguido del término de consulta, en minúsculas
  • consejo: escape caracteres regex especiales en la consulta si la consulta es especificada por el usuario
2
Peter Thoeny 4 mar. 2021 a las 03:18

Aunque tendrá un espacio en blanco adelante, esto funcionará

/(?=[^a|the]).+/i

De hecho, no es necesario utilizar un signo de interrogación

/[^a|the].+/i
0
Jejun 3 mar. 2021 a las 09:05

Realmente no necesita una expresión regular compleja aquí, puede simplemente eliminar los prefijos que no desea y luego obtener la primera letra:

function getArtistFirstLetter(artist) {
  return artist
    .replace(new RegExp('/the |a /i'), '')
    .charAt(0)
}
1
Nicolas Taltaud 3 mar. 2021 a las 08:24