【问题标题】:Javascript regular expression fails when word starts with the danish character æ, ø, å当单词以丹麦字符 æ、ø、å 开头时,Javascript 正则表达式失败
【发布时间】:2013-02-15 21:01:59
【问题描述】:

我的网站上有一个脚本,它突出显示包含通过输入文本字段搜索的单词的 div。每当我搜索以 æ、ø 和 å(丹麦字符)开头的单词时,它都会失败,但如果它们位于单词的其他任何地方,则不会。

我做了一个jsfiddle:

http://jsfiddle.net/8Y3cM/

rx = new RegExp("\\b(" + quest.join("|") + ")", "gi")

如果您搜索 hello,您会看到它突出显示了前 2 个 div,因为它们都包含 hello。但是如果你搜索“ælle”,它不会突出显示包含的 div。

希望有人对此有解决方案 - 提前谢谢您! (:

【问题讨论】:

  • 我无法让你的小提琴工作,但如果你还没有尝试过,请尝试将你的正则表达式与\W结合使用:)
  • 嗯,这很奇怪。您是否按下了搜索按钮,而不是直接输入?我刚刚意识到它与输入无关。这在正则表达式中看起来如何?
  • 字边界\b是基于\w定义的,它只考虑US-ASCII中的字符(确切地说是[0-9a-zA-Z_])。 JS 正则表达式几乎不支持 Unicode,除了疯狂和乏味的字符范围。
  • @JensAhlstenHerlevsen 我只是烂透了,它按预期工作。
  • @nhahtdh 关于 \b 基于 ASCII 的行为是正确的,奇怪的是它在从正则表达式中删除 wordboundary 后也找不到“Ælle”。

标签: javascript regex character


【解决方案1】:

除了有趣的 RegEx 问题,您为什么还需要 RegEx?我认为a simple .indexOf will do fine

$(document).ready(function(){
    $("#search-question-button").click(function () {
        var quest = $('#search-questions-field').val().trim().split(" ").map(function(q){return q.toLowerCase();});

        $(".searchin").each(function() {            
            elm = $(this);
            elm.removeClass('search-successful');
            found = 0;
            var t = elm.text().toLowerCase();
            quest.forEach(function(q){
                if (t.indexOf(q) >= 0) found++;
            });
            if (found===quest.length) elm.addClass("search-successful");
        });      
    });
});

【讨论】:

  • 我不知道,我想我应该提到这一点。这完美!谢谢(:
  • 但我认为当你搜索æ lle时它不应该匹配。可以做任何修改吗?
  • 刚刚意识到是的 :( 开头应该还有单词边界
【解决方案2】:

这不是正则表达式,这是您处理行的方式。这有效:

$("#search-question-button").click(function () {
    var quest = $('#search-questions-field').val().trim().split(" "),
    rx = new RegExp('\\b(' + quest.join("|") + ')', "gi");
    $(".searchin").removeClass('search-successful').addClass(function() {
        return $(this).text().match(rx) ? 'search-successful' : '';
    });
});

我用match 代替replace

http://jsfiddle.net/dfsq/8Y3cM/21/

【讨论】:

  • Hello world 应该只突出显示“hello world”,而不是“hello stackoverflow”。而且,如果您键入“lle”,最后一个会突出显示。
  • 那你为什么用空格分割后使用quest.join("|")呢?
【解决方案3】:

用途:

rx = new RegExp("(^\|[ \n\r\t.,'\"\+!?-]+)(" + quest.join("|") + ")([ \n\r\t.,'\"\+!?-]+\|$)", "gi"),

小提琴:http://jsfiddle.net/8Y3cM/15/

感谢Source

【讨论】:

  • 有了这个解决方案,它只在出于某种原因搜索一个词时才有效? :s
  • 冗余删除:"(^|[ \n\r\t.,'\"+!?-]+)(" + quest.join("|") + ")([ \n\r\t.,'\"+!?-]+|$)"。它仅在搜索 1 个单词时有效,因为它占用了单词之间的空格字符。使用前瞻避免使用字符串:jsfiddle.net/8Y3cM/17
  • 差不多了!现在只有“单词边界”在另一边。我希望这样,如果我只输入“Hello stack”,第二个容器仍然会突出显示。
  • 这当然很容易解决。与您的解决方案一起去。谢谢! :)
猜你喜欢
  • 2021-04-19
  • 1970-01-01
  • 2021-09-05
  • 2015-03-04
  • 2012-11-18
  • 2020-03-07
  • 1970-01-01
  • 2011-10-29
  • 1970-01-01
相关资源
最近更新 更多