首页 > 解决方案 > 负后向正则表达式的替代方法在 Firefox 中不起作用

问题描述

这不是关于这个问题的第一个问题,但我找不到适合我的案例的解决方案。

只有当这些字符前面没有字母数字字符时,我才尝试选择一个字符或一组字符。例子:

这是一个例子(来自https://aniceone.com的简单句子)

我需要匹配“an”、“(a”和“ https://aniceone.com ”中的字母“a ”。

以下表达式在 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>
  );
};

标签: javascriptregexreactjsfirefox

解决方案


您可以找到 的所有匹配项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" ]


推荐阅读