Выделение строк, содержащих фразу с использованием регулярных выражений - PullRequest
2 голосов
/ 26 июня 2019

Я выделяю строки, содержащие определенную фразу, используя регулярное выражение.

Моя текущая функция выделения будет считывать весь текст и помещать каждый экземпляр фразы в интервал выделения.

    const START = "<span name='highlight' style='background-color: yellow;'>";
    const END   = "</span>"

    function highlight(text, toReplace) {

        let reg = new RegExp(toReplace, 'ig');

        return text.replace(reg, START + toReplace + END);
    }

Я хочу расширить свое регулярное выражение, чтобы для каждой фразы оно выделялось от предыдущего <br> до следующего <br>.

highlight("This<br>is some text to<br>highlight.", "text");

Текущий выход:

This<br>is some<span name="highlight" style="background-color:yellow;">text</span> to<br>highlight."

Требуется вывод:

This<br><span name="highlight" style="background-color:yellow;">is some text to</span><br>highlight.

Ответы [ 2 ]

2 голосов
/ 26 июня 2019

Возможно, вы захотите сопоставить все символы, кроме < и >, до и после text, и рекомендуется экранировать текст, который вы передаете конструктору RegExp. Кроме того, чтобы заменить на весь матч, просто используйте $& заполнитель:

const START = "<span name='highlight' style='background-color: yellow;'>";
const END   = "</span>"

function highlight(text, toReplace) {
   let reg = new RegExp("(<br/?>)|[^<>]*" + toReplace.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&') + "[^<>]*", 'ig');
   return text.replace(reg, function ($0,$1) { return $1 ? $1 : START + $0 + END; });
}
console.log(highlight("This<br>is some text to<br>highlight.", "text"));

console.log(highlight("This<br>is a bunch of<br>text", "b"));

Регулярное выражение будет выглядеть как /[^<>]*text[^<>]*/gi, оно будет соответствовать 0 или более символам, отличным от < и >, затем text без учета регистра, а затем снова 0 или более символам, отличным от < и >, а $& в замене поместит соответствующее значение в подсвечивающие теги.

0 голосов
/ 26 июня 2019

Я предполагаю, что это простое выражение

(<br>)(.*?)(\1)

может работать здесь.

const regex = /(<br>)(.*?)(\1)/gs;
const str = `This<br>is some text to<br>highlight. This<br>is some text to<br>highlight.  This<br>is some text to<br>highlight.  


This<br>is some 

text to<br>highlight. This<br>is some text to<br>highlight.  This<br>is some text to<br>highlight.`;
const subst = `$1<span name='highlight' style='background-color: yellow;'>$2</span>$3`;

// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);

console.log(result);

В этом демо приведено объяснение выражения, если вам может быть интересно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...