Альтернатива для отрицательного взгляда за регулярное выражение не работает в Firefox - PullRequest
1 голос
/ 27 января 2020

Это не первый вопрос по этой проблеме, но я не смог найти решение для своего случая.

Я пытаюсь выбрать символ или группу символов только в том случае, если им не предшествует алфавит c символ. Пример:

Это пример (простое предложение из https://aniceone.com)

Мне нужно сопоставить букву "а" от " an "," (a "и" https://aniceone.com ".

Следующее выражение работает в Chrome, но в Firefox, поэтому мне нужна альтернатива.

new RegExp(`((?<!\\w)${query})`, "gi")

Обратите внимание, что содержимое для сопоставления поступает динамически. Здесь вы можете увидеть всю функцию (к вашему сведению, я пытаюсь выделить текст из поискового запроса):

const getHighlightedText = (item, query) => {
  const escapedQuery = query.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
  const parts = item.split(new RegExp(`((?<!\\w)${escapedQuery})`, "gi"));
  return (
    <React.Fragment>
      {parts.map((part, ind) => (
        <span
          key={ind}
          style={
            part.toLowerCase() === query.toLowerCase()
              ? { fontWeight: "bold", backgroundColor: "#eeff00" }
              : {}
          }
        >
          {part}
        </span>
      ))}
    </React.Fragment>
  );
};

1 Ответ

1 голос
/ 28 января 2020

Вы можете найти все совпадения new RegExp(`(\\W|^)(${escapedQuery})`, "gi"), проверить, соответствует ли Группа 1, и заполнить окончательный массив фрагментов, добавив подстроки исходной строки только с соответствующими индексами.

См. Пример:

function splitSpecial(s, query) {
  var current=0, res=[], rx = new RegExp("(\\W|^)(" + query.replace(/[.*+?^${}()|[\]\\]/g, "\\$&") + ")", "gi");
  while (m=rx.exec(s)) {
    res.push(s.substring(current, m.index + (m[1] ? 1 : 0)));
    res.push(m[2]);
    current = m.index + m[0].length;
  }
  if (current < s.length) {
    res.push(s.substr(current));
  }
  return res;
}

console.log(splitSpecial("@abc abc@abc @abc,@abc!@abc", "@abc"));
// => ["", "@abc", " abc@abc ", "@abc", ",", "@abc", "!", "@abc" ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...