Javascript 正则表达式匹配带或不带撇号的字符串

Javascript 正则表达式匹配带或不带撇号的字符串,javascript,regex,Javascript,Regex,我使用用户输入的查询突出显示搜索结果中的单词。一些结果包含像撇号这样的符号,如果撇号输入与否,我想让突出显示起作用。所以,如果我有这个搜索结果 帕特里克·奥哈根 用户输入 奥哈根 或 奥哈根 它应该与突出显示的部分匹配:PatrickO'Hagan 我想到的实现这一点的一种方法是构建一个正则表达式,在用户输入的每个字符后插入一个不需要的撇号,因此查询ohagan将被翻译成这个正则表达式: /(o[']?h[']?a[']?g[']?a[']?n[']?)/gi 这是可行的,但一定有更好的办法

我使用用户输入的查询突出显示搜索结果中的单词。一些结果包含像撇号这样的符号,如果撇号输入与否,我想让突出显示起作用。所以,如果我有这个搜索结果

帕特里克·奥哈根

用户输入

奥哈根

奥哈根

它应该与突出显示的部分匹配:PatrickO'Hagan

我想到的实现这一点的一种方法是构建一个正则表达式,在用户输入的每个字符后插入一个不需要的撇号,因此查询ohagan将被翻译成这个正则表达式:

/(o[']?h[']?a[']?g[']?a[']?n[']?)/gi
这是可行的,但一定有更好的办法

编辑: 我之前提供的示例不清楚,因此我将只提供一个示例代码,该代码应显示我想要实现的目标:

    var resultText = 'Patrick O\'Hagan';
    var query1 = 'o\'hagan';
    var query2 = 'ohagan';

    var regex1 = this.buildRegex(query1);
    var regex2 = this.buildRegex(query2);

    var highlightedText1 = resultText.replace(regex1, x => `<b>${x}</b>`);
    var highlightedText2 = resultText.replace(regex2, x => `<b>${x}</b>`);

    console.log(highlightedText1); //prints: Patrick <b>O'Hagan</b>;
    console.log(highlightedText2); //prints: Patrick <b>O'Hagan</b>;
var resultText='Patrick O'Hagan';
变量query1='o'hagan';
变量query2=‘ohagan’;
var regex1=this.buildRegex(query1);
var regex2=this.buildRegex(query2);
var highlightedText1=resultText.replace(regex1,x=>`${x}`);
var highlightedText2=resultText.replace(regex2,x=>`${x}`);
console.log(highlightedText1)//版画:帕特里克·奥哈根;
console.log(highlightedText2)//版画:帕特里克·奥哈根;
我正在寻找的是
buildRegex
函数,它将构造一个正则表达式,与
resultText
中的查询相匹配,但会忽略每个字符的撇号。

字符
后跟撇号的字符

  • 将关键字(例如,
    obrien
    )转换为字符数组:

    var searchLetters = keyword.split('')
    
    // ['o','b','r','i','e','n']
    
  • 将每个字符转换为一个正则表达式字符串,该字符串将接受
    ${
    文本匹配
    }
    文本匹配
    }
    ,后跟一个智能引号:
    ['
    或一个直接引号:
    ']

    var regexStrings = searchLetters.map(function(character) {
      return `(${character}|${character}['’])`;
    });
    
    // [`(${o}|${o}['’])`,`(${b}|${b}['’])`,`(${r}|${r}['’])`...]
    
  • 接下来,将新的正则表达式字符串数组转换为单个正则表达式字符串,并将其用于:

  • 该RegExp对象将用于包装与以下内容匹配的任何内容:

    var hits=targetContent.innerHTML.replace(regexObject,`1`);
    

  • 演示
    document.getElementById('search').addEventListener('change',函数(e){
    突出显示(此值为“#内容”);
    });
    函数突出显示(关键字、选择器){
    var节点=document.querySelector(选择器);
    var html=node.innerHTML;
    var clean=html.replace(/(|)/,“”);
    var escaped=keyword.replace(/[.*+?^${}()\[\]\\]/gi,\\$&');
    变量字母=转义的.split(“”).map(函数字母){
    返回“(${letter}|${letter}[''])”;
    });
    变量字符串=字母。连接(“”);
    var regex=newregexp(`(${string})`,`gi`);
    var hits=clean.replace(regex,`1`);
    node.innerHTML=点击次数;
    }
    
    墨菲、凯利、奥沙利文、沃尔什、史密斯、奥布莱恩、伯恩、瑞安、奥康纳、奥尼尔、奥莱利、道尔、麦卡锡、加拉赫、奥多尔蒂、肯尼迪、林奇、默里、奎因、摩尔、麦克劳林、奥卡罗尔、康诺利、戴利、奥康奈尔、威尔逊、邓恩、布伦南、伯克、柯林斯、坎贝尔、克拉克、约翰斯顿、休斯、奥法雷尔、菲茨杰拉德、布朗、,马丁、马奎尔、诺兰、弗林、汤普森、奥卡拉汉、奥唐纳、达菲、奥玛奥尼、博伊尔、希利、奥谢、怀特、斯威尼、海斯、卡瓦纳、鲍尔、麦格拉斯、莫兰、布雷迪、斯图尔特、凯西、福利、菲茨帕特里克、奥莱利、麦克唐纳、麦克马洪、唐纳利、里根、多诺万、伯恩斯、弗拉纳根、穆兰、巴里、凯恩、罗宾逊、坎宁安、格里芬、肯尼、,希恩、沃德、惠兰、里昂、里德、格雷厄姆、希金斯、卡伦、基恩、金、梅尔、麦肯纳、贝尔、斯科特、霍根、奥基夫、马吉、麦克纳马拉、麦克唐纳、麦克德莫特、莫罗尼、奥洛克、巴克利、奥德怀尔


    Yes,
    newregexp(search.replace(/'/g',),'i')
    。从搜索文本中删除所有
    。我需要它用撇号突出显示原始字符串。我可能误解了你的意思,但我认为你是在建议从搜索结果和搜索查询中删除撇号?然后使用includes方法。如果string.includes(“”{do something}您希望如何使用撇号“突出显示”子字符串?请编辑问题以解释您真正想要实现的目标。
    var singleRegex = regexStrings.join('');
    var regexObject = new RegExp(`(${singleRegex})`, `gi`);
    
    var hits = targetContent.innerHTML.replace(regexObject, `<mark>$1</mark>`);