使用正则表达式将多语言字符串拆分为单语言令牌

本文关键字:语言 单语言 令牌 字符串 正则表达式 拆分 | 更新日期: 2023-09-27 18:31:24

我想使用正则表达式将多语言字符串拆分为单语言标记。

例如,对于这个英语-阿拉伯语字符串:

"他的名字叫محمد,他的母亲叫آمنه。"

结果必须如下所示:

  1. "他的名字是"
  2. "محمد,"
  3. '他的母亲名叫"
  4. "آمنه。"

使用正则表达式将多语言字符串拆分为单语言令牌

它并不完美(你肯定需要在一些现实世界的例子中尝试一下,看看它是否合适),但这是一个开始:

splitArray = Regex.Split(subjectString, 
    @"(?<='p{IsArabic})    # (if the previous character is Arabic)
    ['p{Zs}'p{P}]+         # split on whitespace/punctuation
    (?='p{IsBasicLatin})   # (if the following character is Latin)
    |                      # or
    (?<='p{IsBasicLatin})  # vice versa
    ['s'p{P}]+
    (?='p{IsArabic})", 
    RegexOptions.IgnorePatternWhitespace);

如果前面的字符来自阿拉伯语块,而后面的字符来自基本拉丁语块(反之亦然),则会在空格/标点符号上拆分。

System.Text.RegularExpressions.Regex regx = new System.Text.RegularExpressions.Regex(@"(['s'(':]*[a-zA-Z]+['s')':]*)+");
var matchs = regx.Matches(input).Cast<System.Text.RegularExpressions.Match>().ToList();