typescript 如何用正则表达式区分阿拉伯语和乌尔都语?

njthzxwz  于 2023-04-22  发布在  TypeScript
关注(0)|答案(1)|浏览(129)

我一直在试图找到一种方法来匹配和区分乌尔都语和阿拉伯语纯粹在regex.我已经找到了几种方法,但他们都不适合我.我不知道的语言,但我知道,乌尔都语字母表是部分来自阿拉伯语,并使用它的一些字符,但必须有一种方法来区分这两个.如果不是用regex,有没有其他的方法来做到这一点?
我正在创建一个打印脚本库,它将检测3种语言(英语,乌尔都语,阿拉伯语),并与这些信息,我将根据其语言应用不同的字体到这些文本。
我发现使用regex的第一种方法是:/[\u0600-\u06ff]|[\u0750-\u077f]|[\ufb50-\ufbc1]|[\ufbd3-\ufd3f]|[\ufd50-\ufd8f]|[\ufd92-\ufdc7]|[\ufe70-\ufefc]|[\uFDF0-\uFDFD]/g匹配阿拉伯语和乌尔都语:/[\u0600-\u06ff]|[\u0750-\u077f]|[\ufd50-\ufd8f]|[\ufe70-\ufeff]/g但问题是所有用于识别urdu的正则表达式都是用于识别阿拉伯语的正则表达式的一部分。
我发现的第二种识别阿拉伯语的方法是使用/\p{IsArabic}/gu,但是当我将其输入regexr,regex101或我的代码时,我得到错误,它不是可识别的unicode类别。
下面是我用来标识代码的代码块

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, }; 
}
nzkunb0c

nzkunb0c1#

JavaScript/ECMAScript对Unicode脚本使用以下语法:

  • \p{Script=Latin}用于英语文本
  • \p{Script=Arabic}用于阿拉伯语/乌尔都语文本

现在,要区分阿拉伯语和乌尔都语,您需要比较它们的范围。
Arabic
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至U+06 FF
U+0750至U+077 F
U+ FB 50至U+FDFF
U+ FE 70至U+FEFF
正如您所看到的,由于乌尔都语只是阿拉伯文字的一个子集,因此在了解到它实际上是\p{Script=Arabic}之后,您基本上可以尝试匹配它们的范围。
然而,许多字符在阿拉伯语变体之间是共享的,并且不是所有要匹配的文本都具有特定语言的唯一字母。对于正则表达式,您可以做的不多,您需要使用一些更高级的检测方法-语法,词汇等。

相关问题