我目前正在开发一个包含突出显示搜索结果的JavaScript功能.具体地说,我想实现这样一种功能:在句子中搜索一个单词,比如‘SEA’,比如‘SEA’,就会得到‘SEA’这个词,而它作为前缀的任何例子,比如‘Season’,都会被加亮.然而,我不想强调当‘Sea’作为后缀出现时,比如在单词‘anusea’中,或者当它出现在像‘疾病’这样的单词中间的时候.

为了实现这一点,我使用了正则表达式/\bsea/gmi,它可以完美地处理英语字符.然而,当应用于瑞典语字符时,它不能产生预期的结果,如‘ä’、‘节’和‘ö’.例如,如果搜索词是‘gen’,则单词‘vägen’中的后缀‘gen’会错误地突出显示.似乎正则表达式将这些字符视为特殊字符或类似字符.我甚至try 添加Unicode修饰符u,但也没有帮助.

由于我的专业知识主要是在C#方面,所以我不熟悉在这种情况下JavaScript是如何工作的.我非常感激任何关于JavaScript如何处理这些情况或如何解决这个问题的见解或指导.

推荐答案

根据u标志的存在,JavaScript的正则表达式引擎不会更改\b的行为.但幸运的是,您可以使用Unicode属性类来模拟它.

在本例中,您的正则表达式将如下所示:/(?<![\p{L}\p{N}_])gen/gmiu.

在这里,我们判断(使用negative lookbehind)gen前面没有紧跟以下任何一项:

  • \p{L}:字母(任何语言),
  • \p{N}:数字(任何语言)
  • _.

基本上,[\p{L}\p{N}_]\w的替代品,考虑了u标志.请注意,这是其他一些正则表达式引擎的默认行为,例如PCRE.

演示here.


在一般情况下,\b可以用/(?<![\p{L}\p{N}_])(?=[\p{L}\p{N}_])|(?<=[\p{L}\p{N}_])(?![\p{L}\p{N}_])/gmu来代替.

演示here.

Javascript相关问答推荐

Regex可以 Select 以任何顺序匹配组

如何从defineExpose访问数据和方法

如何使用JavaScript向html元素添加样式

如何避免使用ajax在Vue 3合成API中重定向

将现场录音发送到后端

如何用拉威尔惯性Vue依赖下拉?

如何从隐藏/显示中删除其中一个点击?

无法从NextJS组件传递函数作为参数'

为什么useState触发具有相同值的呈现

S文本内容和值不必要的不同

如何强制Sphinx中的自定义js/css文件始终加载更改而不缓存?

如何在每次单击按钮时重新加载HighChart/设置HighChart动画?

将内容大小设置为剩余可用空间,但如果需要,可在div上显示滚动条

如何在使用rhandsontable生成表时扩展数字输入验证?

第二次更新文本输入字段后,Reaction崩溃

Nextjs 13.4 Next-Auth 4.2登录(&Quot;凭据&,{});不工作

每次重新呈现时调用useState initialValue函数

FireBase云函数-函数外部的ENV变量

MongoDB通过数字或字符串过滤列表

使用createBrowserRoutVS BrowserRouter的Reaction路由