Tengo cadenas como Japan Company , Chinese Company y esta expresión regular /([AZ])/g para obtener todos los caracteres en mayúscula y luego unirlos al resultado para emitirlos. Pero cuando la cadena de entrada no está en letras en inglés, la expresión regular no funciona.
let string = "Japan Company"; console.log(string.match(/[AZ]/g).join('')); // JC Pero cuando tengo una cadena como日本の会社
let string = "日本の会社"; console.log(string.match(/[AZ]/g).join('')); Esto arroja una excepción como resultado de string.match(/[AZ]/g) es null .
Como estoy tratando de elisionar estas cadenas y los jeroglíficos no tienen mayúsculas, la expresión regular debe coincidir solo con los primeros caracteres de cada palabra donde las palabras están separadas por espacios.
Algo así como [:upper:] de POSIX, pero esto no funciona para el motor de expresiones regulares de JavaScript.
Puedes usar
(string.match(/(?<!\S)\S/g) || [string]).join('')Vea la demostración de JavaScript:
const strings = ["Japan Company", "japan company", "日本の会社"]; for (const string of strings) { console.log(string, '=>', (string.match(/(?<!\S)\S/g) || [string]).join('').toUpperCase()) } La expresión regular (?<!\S)\S coincide con un carácter que no es un espacio en blanco al comienzo de la cadena o después de un carácter de espacio en blanco.
Un patrón de Safari, sin mirar hacia atrás:
var strings = ["Japan Company", "japan company", "日本の会社"]; for (var i=0; i<strings.length; i++) { var m = strings[i].match(/(?:^|\s)(\S)/g) if (m === null) { console.log(strings[i], '=> ', strings[i]) } else { console.log(strings[i], '=>', m.join('').replace(/\s+/g, '').toUpperCase()) } }Según sus comentarios, creo que esto debería hacer lo que quiere.
function getUppercaseLetters(string) { // Find uppercase letters in the string let matches = string.match(/[AZ]/g); // If there are no uppercase letters, get the first letter of each word if (!matches) matches = string.split(" ").map(word => word[0]); // If there are still no matches, return an empty string. This should prevent against any edge cases. if (!matches) return ""; // Join the array elements and make it uppercase. return matches.join("").toUpperCase(); }