Estoy contando cuántas veces aparecen palabras diferentes en un texto usando expresiones regulares en JavaScript. Mi problema es cuando he citado palabras: 'word' debe contarse simplemente como word (sin las comillas, de lo contrario se comportarán como dos palabras diferentes), mientras it's debe contarse como una palabra completa.
(?<=\w)(')(?=\w)
Esta expresión regular puede identificar apóstrofes dentro, pero no alrededor de las palabras. El problema es que no puedo usarlo dentro de un juego de caracteres como [\w]+ .
(?<=\w)(')(?=\w)|[\w]+
Contará it's a 'miracle' of nature como 7 palabras, en lugar de 5 ( it , ' , se s convirtiendo en 3 palabras diferentes). Además, la tercera palabra debe seleccionarse simplemente como miracle , y no como 'miracle' .
Para complicar aún más las cosas, también necesito capturar signos diacríticos, así que estoy usando [A-Za-zÀ-ÖØ-öø-ÿ] en lugar de \w .
¿Cómo puedo lograr eso?
1) Simplemente puede usar /[^\s]+/g expresión regular
const str = `it's a 'miracle' of nature`; const result = str.match(/[^\s]+/g); console.log(result.length); console.log(result); 2) Si está calculando el número total de palabras en una cadena, también puede usar split como:
const str = `it's a 'miracle' of nature`; const result = str.split(/\s+/); console.log(result.length); console.log(result); 3) Si desea una palabra sin quote al principio y al final, puede hacer lo siguiente:
const str = `it's a 'miracle' of nature`; const result = str.match(/[^\s]+/g).map((s) => { s = s[0] === "'" ? s.slice(1) : s; s = s[s.length - 1] === "'" ? s.slice(0, -1) : s; return s; }); console.log(result.length); console.log(result);Puede usar una alternancia con 2 grupos de captura y luego verificar los valores de esos grupos.
(?<!\S)'(\S+)'(?!\S)|(\S+)(?<!\S)' Mirada negativa hacia atrás, afirmar un límite de espacio en blanco a la izquierda y hacer coincidir '(\S+) Grupo de captura 1 , emparejar 1+ caracteres que no sean espacios en blanco'(?!\S) Match ' y afirmar un límite de espacio en blanco a la derecha| O(\S+) Grupo de captura 2 , emparejar 1+ caracteres que no sean espacios en blancoVea una demostración de expresiones regulares .
const regex = /(?<!\S)'(\S+)'(?!\S)|(\S+)/g; const s = "it's a 'miracle' of nature"; Array.from(s.matchAll(regex), m => { if (m[1]) console.log(m[1]) if (m[2]) console.log(m[2]) });