【问题标题】:Regex to match string with or without apostrophe正则表达式匹配带或不带撇号的字符串
【发布时间】:2019-05-28 21:39:35
【问题描述】:

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

帕特里克·奥哈根

用户进入

奥哈根

或者

欧根

它应该与突出显示的部分匹配:Patrick O'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>;

我正在寻找的是 buildRegex 函数,该函数将构造一个正则表达式,该表达式将匹配 resultText 中的查询,但会忽略撇号。

【问题讨论】:

  • 是的,new RegExp(search.replace(/'/g, ''), 'i')。从搜索文本中删除所有'
  • 我需要用撇号突出显示原始字符串。我可能误解了您要说的内容,但我认为您建议只从搜索结果和搜索查询中删除撇号?
  • 然后使用includes方法。如果 string.includes(“‘”) {做某事}
  • 您究竟想如何用撇号“突出显示”子字符串?
  • 那么请编辑问题以解释您真正想要实现的目标。

标签: javascript regex


【解决方案1】:

Alternation | 每个字符

字符 OR 后跟撇号的字符

  1. split() 将关键字(例如obrien)转换为字符数组:

    var searchLetters = keyword.split('')
    
    // ['o','b','r','i','e','n']
    
  2. map() 将每个字符转换为一个正则表达式字符串,该字符串将接受 ${literal match} OR| ${literal match} 后跟一个智能引号:[’ 或单引号:']:

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

    var singleRegex = regexStrings.join('');
    var regexObject = new RegExp(`(${singleRegex})`, `gi`);
    
  4. 该 RegExp 对象将用于包装与 &lt;mark&gt; tag 匹配的任何内容:

    var hits = targetContent.innerHTML.replace(regexObject, `<mark>$1</mark>`);
    

演示

document.getElementById('search').addEventListener('change', function(e) {
  highlight(this.value, '#content');
});

function highlight(keyword, selector) {
  var node = document.querySelector(selector);
  var html = node.innerHTML;
  var clean = html.replace(/(<mark>|<\/mark>)/, '');
  var escaped = keyword.replace(/[.*+?^${}()|[\]\\]/gi, '\\$&');
  var letters = escaped.split('').map(function(letter) {
    return `(${letter}|${letter}['’])`;
  });
  var string = letters.join('');
  var regex = new RegExp(`(${string})`, `gi`);
  var hits = clean.replace(regex, `<mark>$1</mark>`);
  node.innerHTML = hits;
}
<input id='search' type='search'><input type='button' value='search'>

<article id='content'>
  <p>Murphy, Kelly, O’Sullivan, Walsh, Smith, O’Brien, Byrne, Ryan, O’Connor, O’Neill, O’Reilly, Doyle, McCarthy, Gallagher, O’Doherty, Kennedy, Lynch, Murray, Quinn, Moore, McLoughlin, O’Carroll, Connolly, Daly, O’Connell, Wilson, Dunne, Brennan, Burke, Collins, Campbell, Clarke, Johnston, Hughes, O’Farrell, Fitzgerald, Brown, Martin, Maguire, Nolan, Flynn, Thompson, O’Callaghan, O’Donnell, Duffy, O’Mahony, Boyle, Healy, O’Shea, White, Sweeney, Hayes, Kavanagh, Power, McGrath, Moran, Brady, Stewart, Casey, Foley, Fitzpatrick, O’Leary, McDonnell, MacMahon, Donnelly, Regan, Donovan, Burns, Flanagan, Mullan, Barry, Kane, Robinson, Cunningham, Griffin, Kenny, Sheehan, Ward, Whelan, Lyons, Reid, Graham, Higgins, Cullen, Keane, King, Maher, MacKenna, Bell, Scott, Hogan, O’Keeffe, Magee, MacNamara, MacDonald, MacDermott, Molony, O’Rourke, Buckley, O’Dwyer</p>
</article>

【讨论】:

    猜你喜欢
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2016-08-08
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多