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