Регулярное выражение для сопоставления строки с апострофом или без него - PullRequest
0 голосов
/ 02 января 2019

Я выделяю слова в результатах поиска, используя запрос, который вводит пользователь.Некоторые из результатов содержат символы, такие как апострофы, и я хотел бы, чтобы подсветка работала, введен апостроф или нет.Итак, если у меня есть этот результат поиска

Патрик О'Хаган

И пользователь вводит

О'Хаган

Или

Охаган

Он должен совпадать с выделенной частью: Патрик О'Хаган

Один из способов добиться этого, о котором я подумал, - построить регулярное выражение, вставив необязательный апостроф послекаждый введенный пользователем символ, поэтому запрос 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 но проигнорирует апострофы.

1 Ответ

0 голосов
/ 02 января 2019

Чередование | для каждого символа

Либо символ OR символ, за которым следует апостроф

  1. split() ключевое слово (например, obrien) в массив символов:

    var searchLetters = keyword.split('')
    
    // ['o','b','r','i','e','n']
    
  2. map()каждый символ в строке регулярного выражения, который будет принимать либо ${ буквальное совпадение } ИЛИ | ${ буквальное совпадение }, за которым следует одна умная кавычка: [’ или одиночная прямая кавычка: ']:

    var regexStrings = searchLetters.map(function(character) {
      return `(${character}|${character}['’])`;
    });
    
    // [`(${o}|${o}['’])`,`(${b}|${b}['’])`,`(${r}|${r}['’])`...]
    
  3. Далее join() новый массив строк регулярного выражения в одну строку регулярного выражения и использование его в объекте RegExp :

    var singleRegex = regexStrings.join('');
    var regexObject = new RegExp(`(${singleRegex})`, `gi`);
    
  4. Этот объект RegExp будет использоваться для переноса любых совпадений с тегом <mark> :

    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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...