javascript regex将瑞典字符视为特殊字符并错误匹配

pjngdqdw  于 2023-05-30  发布在  Java
关注(0)|答案(2)|浏览(278)

我目前正在开发一个JavaScript功能,涉及突出显示搜索结果。具体地说,我想实现一个功能,在一个句子中搜索一个词,比如“sea”,比如“the sea causes me恶心in this season”,将导致单词“sea”和任何它作为前缀的情况,比如单词“season”被高亮显示。然而,我不想强调“sea”作为后缀出现在单词“恶心”中的情况,也不想强调它在单词“疾病”中的情况。
为了实现这一点,我使用正则表达式/\bsea/gmi,它可以完美地处理英语字符。然而,当应用于瑞典语字符时,它无法产生所需的结果,如'ä'、' å'和'ö'。例如,如果搜索词是“gen”,则单词“vägen”中的后缀“gen”被错误地突出显示。看起来正则表达式将这些字符视为特殊字符或类似的字符。我甚至尝试添加Unicode修饰符u,但这也没有帮助。
由于我的专业知识主要是C#,所以我不熟悉JavaScript在这种情况下的行为。我将非常感谢任何关于JavaScript如何处理这些情况或如何解决这个问题的见解或指导。

uxh89sit

uxh89sit1#

JavaScript的正则表达式引擎不会根据u标志的存在而改变\b的行为。但幸运的是,您可以使用Unicode属性类来模仿它。
在这种情况下,你的正则表达式看起来像这样:/(?<![\p{L}\p{N}_])gen/gmiu
在这里,我们检查(使用negative lookbehindgen前面没有任何:

  • \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

eit6fx6z

eit6fx6z2#

您可以更改您的正则表达式来处理瑞典语字符,如下所示:

const searchTerm = 'sea';
const sentence = 'the sea causes me nausea in this season vägen';

const pattern = new RegExp(`\\b${searchTerm}|\\b${searchTerm}[äåöÄÅÖ]\\w*`, 'gmi');
const highlightedSentence = sentence.replace(pattern, (match) => `<mark>${match}</mark>`);

console.log(highlightedSentence);
  • \B${searchTerm}[äåöÄÖ]\w* 匹配单词'sea'后跟瑞典语字符
  • gmi用于执行全局搜索
  • mark标记用于突出显示文本

相关问题