如何检测字符串中是否包含印地文(devnagri)以及字符和字数

How to detect if a string contains hindi (devnagri) in it with character and word count

下面是一个示例字符串 -

$string = "abcde वायरस abcde"

我需要检查这个字符串是否包含任何印地语(天城文)内容,如果是的话,还需要检查字符数和单词数。我想带有 unicode 字符 class 的正则表达式可以工作 http://www.regular-expressions.info/unicode.html。但我无法找出正确的正则表达式语句。

要查明字符串是否包含印地语(梵文)字符,您需要拥有所有印地语字符的完整列表。根据this website,印地语字符是0x09000x097F之间的十六进制字符(十进制2304到2431)。

正则表达式模式需要匹配,如果这些字符中的任何一个在集合中。因此,你可以使用一个模式(实际上是一组字符)来匹配字符串,它看起来像这样:

[\u0900\u0901\u0902 ... \u097D\u097E\u097F]

由于手动写下这个字符列表比较麻烦,您可以通过迭代从 2304 到 2431 的十进制字符或十六进制字符来生成此字符串。

要计算包含至少一个印地语字符的所有单词,您可以使用以下模式。它包含单词周围的白色-space(\s)或单词周围的开头(^)或结尾($),以及一个全局标志,以匹配每次出现 (/g):

/(?:^|\s)[\u0900\u0901\u0902 ... \u097D\u097E\u097F]+?(?:\s|$)/g

这是 JavaScript 中的实时实现:

var numberOfHindiCharacters = 128;
var unicodeShift = 0x0900;
var hindiAlphabet = [];
for(var i = 0; i < numberOfHindiCharacters; i++) {
  hindiAlphabet.push("\u0" + (unicodeShift + i).toString(16));
}

var regex = new RegExp("(?:^|\s)["+hindiAlphabet.join("")+"]+?(?:\s|$)", "g");
var string1 = "abcde वायरस abcde";
var string2 = "abcde abcde";

[ string1.match(regex), string2.match(regex) ].forEach(function(match) {
  if(match) {
    console.log("String contains " + match.length + " words with Hindi characters only.");
  } else {
    console.log("String does NOT contain any words with Hindi characters only.");
  }
});