javascript - ¿Cómo puedo diferenciar entre árabe y urdu con regex?
He estado tratando de encontrar una manera de diferenciar y distinguir entre urdu y árabe únicamente con expresiones regulares. He encontrado algunas formas, pero no me están funcionando. No conozco exactamente los idiomas, pero sé que el alfabeto urdu se deriva parcialmente del árabe y utiliza algunos de sus caracteres, pero tiene que haber una manera de distinguir entre los dos. Si no es con expresiones regulares, ¿hay otra manera de hacerlo?
Estoy creando una biblioteca en TypeScript que detectará 3 idiomas (inglés, urdu, árabe) y con esa información aplicaré diferentes fuentes a esos textos dependiendo de su idioma.
La primera forma que encontré usando regex fue: /[\u0600-\u06ff]|[\u0750-\u077f]|[\ufb50-\ufbc1]|[\ufbd3-\ufd3f]|[\ufd50-\ufd8f]|[\ufd92-\ufdc7]|[\ufe70-\ufefc]|[\uFDF0-\uFDFD]/g para coincidir con árabe, y para urdu: /[\u0600-\u06ff]|[\u0750-\u077f]|[\ufd50-\ufd8f]|[\ufe70-\ufeff]/g, pero el problema con esto es que todo el regex usado para identificar urdu es parte de lo que se usa para identificar árabe.
La segunda manera que encontré para identificar árabe es usar /\p{IsArabic}/gu, pero cuando lo ingreso en regexr, regex101, o en mi código obtengo errores de que no es una categoría Unicode reconocida.
El siguiente es un bloque de código que estoy usando para identificar el código
interface LanguageInterface {
hasEnglish: boolean;
hasUrdu: boolean;
hasArabic: boolean;
}
function getLang(str): LanguageInterface {
let hasEnglish: boolean = false;
let hasUrdu: boolean = false;
let hasArabic: boolean = false;
// string has english characters
if (str.match(/([\u0041-\u005A]|[\u0061-\u007E])+/g)) hasEnglish = true;
// string has urdu words/ characters
if (str.match(/[\u0600-\u06ff]|[\u0750-\u077f]|[\ufd50-\ufd8f]|[\ufe70-\ufeff]/g)) hasUrdu = true;
// string has arabic words/ characters
if(str.match(/\p{IsArabic}/gu)) hasArabic = true;
return { hasEnglish, hasUrdu, hasArabic, };
}
Respuesta #1
JavaScript/ECMAScript usa esta sintaxis para scripts Unicode:
\p{Script=Latin}para texto en inglés\p{Script=Arabic}para texto en árabe/urdu
Ahora, para diferenciar árabe y urdu, tendrías que comparar sus rangos.
Árabe :
U+0600-U+06FF
U+0750-U+077F
U+0870-U+089F
U+08A0-U+08FF
U+FB50-U+FDFF
U+FE70-U+FEFF
U+10EC0-U+10EFF
U+1EE00-U+1EEFF
Urdu :
U+0600 a U+06FF
U+0750 a U+077F
U+FB50 a U+FDFF
U+FE70 a U+FEFF
Dado que el urdu es solo un subconjunto del alfabeto árabe, como puedes ver, básicamente puedes intentar igualar sus rangos después de aprender que de hecho es \p{Script=Arabic}.
Sin embargo, muchos caracteres se comparten entre variantes árabes y no todo el texto que emparejarás tendrá letras únicas para un idioma específico. No hay mucho que puedas hacer con regex, necesitarías usar métodos de detección más avanzados: gramática, vocabulario, etc.