javascript - 负后向正则表达式的替代方法在 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>
);
};
解决方案
您可以找到 的所有匹配项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" ]
推荐阅读
- c++ - 我的 C++ 程序不工作......只是卡在这个不知道该怎么做
- oauth - 如何注册 Github 应用以进行 JWT 登录
- reactjs - 如何解决在 onClick 事件之后工作一步的状态更改问题
- javascript - 在 chrome 扩展中使用 tensorflowjs
- c++ - 有没有更好的方法来命名管道`cv::mat`变量
- c# - 树数据结构加载巨大的数据表 800K 行 - 30K+ 分支
- git - GitHub 发现了漏洞(推送到 github 时) - 但是 /network/alerts 不存在?
- neural-network - TPU 训练在训练过程中冻结
- android - 如何使用 Twilio api 从 Android 应用发送短信
- c# - 为什么 Azure Function v2 无法绑定到 CloudTable?