【问题标题】:How to use whole word regex search for Devanagari text?如何使用全字正则表达式搜索梵文文本?
【发布时间】:2014-06-07 20:12:00
【问题描述】:

我的带有梵文单词的 HTML 代码

<html>
<head>
<title>TODO</title>
<meta charset="UTF-8">
</head>
<body>
    मंत्री मुख्यमंत्री 
</body>
    <script src="jquery-1.11.0.min.js"></script>
    <script src="xregexp_20.js"></script>
    <script src="addons/unicode/unicode-base.js"></script>
    <script src="addons/unicode/unicode-scripts.js"></script>
    <script src="my.js"></script>
</html>

我的 JavaScript 代码

var html = document.getElementsByTagName("html")[0];
var fullpage_content = html.innerHTML;

var regex = RegExp("मंत्री", "g");
var count = fullpage_content.match(regex);
console.log("count in page : " + count+ ", " + count.length);

//use of word boundry ,not supported by devanagari characters
regex = RegExp("\\bमंत्री\\b", "g");
count = fullpage_content.match(regex);
console.log("count in page : " + count);

regex = XRegExp("मंत्री");
var match = XRegExp.matchChain(fullpage_content, [regex]);
console.log("count in page : " + match + ", " + match.length);

//xregex do not support word boundry \\b
regex = XRegExp("\\bमंत्री\\b");
match = XRegExp.matchChain(fullpage_content, [regex]);
console.log("count in page : " + match + ", " + match.length);

js 的输出(在 Chrome 上)

页数:मंत्री,मंत्री, 2

页数:null

页数:मंत्री,मंत्री, 2

页数: , 0

整个单词搜索应该给出一个答案,但是 regexp 和 XRegExp 都让我失望了。我需要一些帮助。

【问题讨论】:

  • 你能给我们这个小提琴吗?
  • @PrabhatJain 我为我创建了一个。你可以看看jsfiddle.net/es63p
  • 如果有帮助,请检查一下你的小提琴。
  • 这里是更新的小提琴。 jsfiddle.net/es63p/3 BTW 我想问这​​个问题的人想使用 xregexp 库。该脚本未返回实际字数。

标签: javascript regex unicode hindi xregexp


【解决方案1】:

在小提琴中添加这个并检查是否有什么帮助你

alert(fullpage_content);
//match(/मंत्री/g);
alert("मंत्री मुख्यमंत्री".match(/मंत्री/g));

【讨论】:

    【解决方案2】:

    如果您假设每个单词后跟一个或多个空格作为字符中断,那么遵循 js 正则表达式将为您提供正确的结果

    console.log("count inline without xRegExp:" + "मंत्री मुख्यमंत्री".match(/मंत्री\s+/g));
    

    【讨论】:

      【解决方案3】:

      使用这个正则表达式我可以在 मंत्री 上得到匹配,但排除 मुख्यमंत्री:

      var regex = XRegExp("(?:^|\\P{L})मंत्री(?=\\P{L}|$)");
      

      它的作用是匹配 मंत्री 如果它:

      1. 在字符串的开头或前面有一个 Unicode 认为是非字母的字符,并且

      2. 位于字符串末尾或后跟一个 Unicode 认为非字母的字符。

      请注意,这与 \b 所做的略有不同,因为 \b 不匹配数字。例如,/\bmantri\b/ 不会匹配 mantri123,因为 123 被认为是单词的一部分,因此不会标记单词边界。如果您想要模拟 \b 的东西,那么可以这样做:

      var regex = XRegExp("(?:^|[^\\p{L}\\p{N}])मंत्री(?=[^\\p{L}\\p{N}]|$)");
      

      与第一个正则表达式的区别在于,这个正则表达式的 मंत्री 不能在数字之前或之后。

      我在正则表达式的末尾使用了否定前瞻,因此您的单词后面的字符被排除在结果之外。没有等效的否定后视,因此如果在 मंत्री 之前有一个字符,它出现在结果中。您必须决定要针对您的特定应用程序使用此字符做什么。

      【讨论】:

        【解决方案4】:
        regex = XRegExp("(?:^|[^\\p{Devanagari}\\p{L}])मंत्री(?=[^\\p{Devanagari}\\p{L}]|$)");
        

        解决了。特别感谢路易斯。 在最终确定之前,我测试了一个更严格的测试用例。

        मंत्रीमंत्रीमंत्रीमंत्रीमंत्रीमंत्रीमंत्रीमंमंत्रीमंत्रीमंत्रीमंत्री 。,,,,,,,,,,,,,,,,,,मंत्री,मंत्री,मंत्री,,मंत्री,

        मंत्री, मंत्री

        मंत्री,मंत्री

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-28
          • 2014-04-06
          • 1970-01-01
          相关资源
          最近更新 更多