You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Regex区分阿拉伯语与乌尔都语?TypeScript语言检测求助

区分英语、乌尔都语、阿拉伯语的解决方案

针对你在TypeScript开发语言检测库时遇到的正则区分难题,以下是具体的问题分析和可行解决思路:

核心问题拆解

  1. 乌尔都语与阿拉伯语的正则范围重叠:你使用的[\u0600-\u06ff]等Unicode字符块同时覆盖了两种语言的字符,因为二者同属阿拉伯文字体系,纯靠通用阿拉伯字符块无法区分。
  2. \p{IsArabic}语法不兼容:JavaScript/TypeScript的ECMAScript正则引擎不支持\p{IsArabic}写法,正确的Unicode脚本属性语法为\p{sc=Arabic}或\p{Script=Arabic},但即便使用该语法,也无法直接区分乌尔都语(乌尔都语的脚本类型也属于Arabic)。

可行解决方案

1. 基于乌尔都语专属字符的正则区分

乌尔都语存在一些阿拉伯语中没有的专属字符(如ے、ڑ、ڈ、ݨ等),可以通过检测这些字符标记乌尔都语,剩余的阿拉伯脚本字符则判定为阿拉伯语。

修改后的TypeScript检测函数:

interface LanguageInterface { 
  hasEnglish: boolean; 
  hasUrdu: boolean; 
  hasArabic: boolean; 
}

function getLang(str: string): LanguageInterface { 
  let hasEnglish = false; 
  let hasUrdu = false; 
  let hasArabic = false;

  // 检测英语(ASCII字母及常用符号)
  if (/[\u0041-\u005A\u0061-\u007E]/.test(str)) {
    hasEnglish = true;
  }

  // 检测乌尔都语专属字符(Unicode码点对应乌尔都语独有的字母)
  const urduExclusiveRegex = /[\u06C1\u06D2\u0686\u067E\u0698\u06AF]/;
  if (urduExclusiveRegex.test(str)) {
    hasUrdu = true;
  }

  // 检测阿拉伯脚本字符,且排除已判定为乌尔都语的情况
  const arabicScriptRegex = /\p{sc=Arabic}/u;
  if (arabicScriptRegex.test(str) && !hasUrdu) {
    hasArabic = true;
  }

  return { hasEnglish, hasUrdu, hasArabic }; 
}

说明:

  • 使用test()替代match()更高效,仅需判断是否存在匹配,无需返回匹配结果;
  • 必须添加u修饰符,否则Unicode属性类无法生效。

2. 基于语言检测库的精准方案(推荐)

如果需要处理无专属字符的乌尔都语文本,或应对混合语言场景,建议使用成熟的语言检测库(如franc),它通过字符频率统计识别语言,准确率更高。

安装依赖:

npm install franc @types/franc

使用示例:

import franc from 'franc';

interface LanguageInterface { 
  hasEnglish: boolean; 
  hasUrdu: boolean; 
  hasArabic: boolean; 
}

function getLang(str: string): LanguageInterface { 
  // 检测主语言
  const detectedLang = franc(str, { minLength: 1 });
  let hasEnglish = detectedLang === 'eng';
  let hasUrdu = detectedLang === 'urd';
  let hasArabic = detectedLang === 'ara';

  // 处理混合文本或短文本的补充检测
  if (!hasEnglish && !hasUrdu && !hasArabic) {
    hasEnglish = /[\u0041-\u005A\u0061-\u007E]/.test(str);
    const hasUrduChars = /[\u06C1\u06D2\u0686\u067E\u0698\u06AF]/.test(str);
    hasUrdu = hasUrduChars;
    hasArabic = /\p{sc=Arabic}/u.test(str) && !hasUrdu;
  }

  return { hasEnglish, hasUrdu, hasArabic }; 
}

关于Unicode属性类的补充说明

ECMAScript正则引擎仅支持基于**Unicode脚本(Script)或通用类别(General Category)**的属性类,正确写法为:

  • 匹配阿拉伯脚本字符:/\p{sc=Arabic}/u 或 /\p{Script=Arabic}/u
  • 你之前使用的\p{IsArabic}是PCRE等其他正则引擎的语法,ECMAScript不支持,因此会报错。

内容的提问来源于stack exchange,提问作者Opelcorsa2001

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 17:33:17