JS正则表达式名称突出显示

时间:2011-11-24 10:38:12

标签: javascript regex

我正在创建一个自动完成,结果突出显示我遇到了一些问题。您看到我的搜索算法非常慷慨并忽略了结果中的撇号,因此像joes这样的查询将匹配Joe's。搜索算法得到了解决,现在成为突出部分。我想把匹配的图案加粗。

假设我有一个原始的无格式结果:Joe’s请注意rsquo \ u2019)我想突出显示如下:Joe’s,对于以下内容查询joesjoe'sjoe’s (rsquo \ u2019)

我在查询中包含了右侧单引号,因为您不知道是否有人从word文档或其他内容复制查询。

我可以轻易地忽略引号在搜索/结果字符串中存在这一事实,但是当你不小心输入类似joes'或更差的内容时,这会弄乱搜索的整个点。 {1}}。所以我不知何故需要保留报价位置。另请注意,撇号也可以在未格式化的结果字符串中的任何位置,如jo'es

以下是一系列方案:


  • 字符串:Suq'Ata
  • 查询:Liliana'slilianas
  • 结果:liliana's

  • 字符串:Liliana's
  • 查询:Suq'Atasuqat
  • 结果:suq'at

  • 字符串:Suq'Ata
  • 查询:Telim'Tor'stelimt
  • 结果:telim't

应该注意的是,查询中引号的位置很重要,而当您在查询中放错引号时,它根本不匹配。所以它要么你有正确的引用位置,要么根本没有引号来突出显示原始字符串。

我实际上不介意提议的解决方案是否要拆分每个字母并循环遍历它(已经考虑过),因为我将在给定时间执行此操作最多5个字符串。我期待着你的建议!

1 个答案:

答案 0 :(得分:1)

更新了提问者的问题规范:

  1. 如果用户的查询有引号,则其位置必须与原始字符串的引号匹配。例如。查询“jo'es”与原始字符串“Joe's”不匹配。
  2. 我们只需要打扰将查询的开头与原始字符串的开头匹配。

  3. 我可以想到更好的算法,但是从这里开始是一个快速而又脏的第一次尝试,使用每个字母方法的天真循环:

    var quotesRegex = /['\u2019]/g;
    
    function highlightMatch(origStr, query) {        
        query = query.toLowerCase();
    
        var j = 0;
        for (var i = 0; i < query.length; ++i, ++j) {
            // Query has a quote; it needs to be in the same position as origStr
            if (query.charAt(i).match(quotesRegex)) { 
                if (!origStr.charAt(j).match(quotesRegex)) {
                    return origStr;  // quote position mismatch
                }
                continue;
            }
    
            while (origStr.charAt(j).match(quotesRegex)) {
                j++;                
            }
    
            if (origStr.charAt(j).toLowerCase() != query.charAt(i)) {
                return origStr;
            }
        }
    
        return "<b>" + origStr.slice(0, j) + "</b>" + origStr.slice(j);
    }
    

    JSFiddle:http://jsfiddle.net/FFt2T/6/