正则如何完整匹配整个单词

2024-03-14 09:42:22 +08:00
 laters

我有一个规则清单

const keywords = [Stop,.............]

monaco.languages.register({ id: "mySpecialLanguage" });

monaco.languages.setMonarchTokensProvider("mySpecialLanguage", {
    tokenizer: {
        root: [
            [/(?<!\w)Stop(?!\w)/, 'keyword']
        ],
    },
});

monaco.editor.defineTheme("myCoolTheme", {
    base: "vs",
    inherit: false,
    rules: [
        { token: 'keyword', foreground: 'f1d710' },
    ],
    colors: {
        "editor.foreground": "#000000",
    },
});


monaco.editor.create(document.getElementById("container"), {
    theme: "myCoolTheme",
    value: `Stop
QdStop
qdStop
11Stop
StopSS
Stop11
Stopdd 
    `,
    language: "mySpecialLanguage",
});

我期望将 keywords 中的所有单词高亮显示,列表中包含 Stop,但以 Stop 结尾的单词仍会高亮显示

Stop 开头的效果是正确的,但是 Stop 结尾的效果是错误的,应该显示为黑色,而不是黄色

如何将其突出显示为仅用于停用词的关键字,如果前后有字母或单词,则不应突出显示

2598 次点击
所在节点    正则表达式
32 条回复
wwwwaaanng
2024-03-14 11:13:15 +08:00
不要贴代码,直接说规则
wwwwaaanng
2024-03-14 11:14:51 +08:00
如何将其突出显示为仅用于停用词的关键字,如果前后有字母或单词,则不应突出显示
没看懂你这句话想要什么规则
InDom
2024-03-14 11:15:33 +08:00
零宽断言
A3m0n
2024-03-14 11:16:37 +08:00
原文本单词和单词之间有空格分割吗?

是这样的吗?

Stop One AppleStop
alexsz
2024-03-14 11:24:34 +08:00
\bStop\b
laters
2024-03-14 13:32:29 +08:00
@alexsz 这样并不行
laters
2024-03-14 13:32:53 +08:00
@wwwwaaanng #2 只匹配 Stop 其余的全部匹配
laters
2024-03-14 13:33:49 +08:00
@A3m0n 期望的是只匹配 Stop 其余的全不匹配,不管是 *Stop 还是 Stop* 还是 **Stop**
laters
2024-03-14 13:33:55 +08:00
@wwwwaaanng #2 期望的是只匹配 Stop 其余的全不匹配,不管是 *Stop 还是 Stop* 还是 **Stop**
laters
2024-03-14 13:34:12 +08:00
@InDom 能大概写下吗。 我对正则不太了解
QYJ
2024-03-14 14:47:11 +08:00
^Stop$:适合字符串为“Stop”
\bStop\b:适合字符串中,有独立的 Stop 单词
NoOneNoBody
2024-03-14 15:08:10 +08:00
^Stop|Stop$ 适合 Stop 位于开头或结尾,不能匹配位于中间的情况
如果任意位置,直接用 Stop 不加其他符号就行了
laters
2024-03-14 15:20:51 +08:00
@NoOneNoBody 只想要 Stop 独立存在的时候匹配上, xxxxStop Stopxxx 都不应该匹配上
laters
2024-03-14 15:21:24 +08:00
@QYJ 如果这种场景呢,Stop 独立存在的时候匹配上,xxxxStop Stopxxx 都不应该匹配上
lynan
2024-03-14 15:30:16 +08:00
11 楼已经给了答案了。
就是 **^Stop$*
lynan
2024-03-14 15:30:34 +08:00
^Stop$
NoOneNoBody
2024-03-14 15:32:48 +08:00
@laters #13
按例子和要求。#11 就可以了
llh880808
2024-03-14 15:35:01 +08:00
正文里的(?<!\w)Stop(?!\w)就是零宽断言的写法,要求 stop 前后不是\w

更简洁的写法就是 5L 提供的 \bStop\b ,要求 Stop 前后必须是 boundary

我不知道你为什么测试失败,因为我在 regex101 测试两种写法都是 ok 的,链接如下:

https://regex101.com/r/5Ifg8u/1
llh880808
2024-03-14 15:37:35 +08:00
@llh880808 #15

“正文里的...”后面的内容被吞掉了,重新打一遍

正文里的写法就是零宽断言,断言 Stop 前后不是`\w`
laters
2024-03-14 15:39:11 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/1023479

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX