V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
laters
V2EX  ›  正则表达式

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

  •  
  •   laters · 283 天前 · 1963 次点击
    这是一个创建于 283 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我有一个规则清单

    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 结尾的效果是错误的,应该显示为黑色,而不是黄色

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

    32 条回复    2024-03-18 21:28:44 +08:00
    wwwwaaanng
        1
    wwwwaaanng  
       283 天前
    不要贴代码,直接说规则
    wwwwaaanng
        2
    wwwwaaanng  
       283 天前
    如何将其突出显示为仅用于停用词的关键字,如果前后有字母或单词,则不应突出显示
    没看懂你这句话想要什么规则
    InDom
        3
    InDom  
       283 天前
    零宽断言
    A3m0n
        4
    A3m0n  
       283 天前   ❤️ 1
    原文本单词和单词之间有空格分割吗?

    是这样的吗?

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

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

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

    https://regex101.com/r/5Ifg8u/1
    llh880808
        19
    llh880808  
       283 天前
    @llh880808 #15

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

    正文里的写法就是零宽断言,断言 Stop 前后不是`\w`
    NoOneNoBody
        22
    NoOneNoBody  
       283 天前
    @laters #21
    你向上看,好几个人跟你说了#11 是正确答案,你都 block 了?
    为什么别人给的答案你非要加个\w 呢?

    PS: 我第一个回答理解错了题意,以为是要提取,但后来知道了要排除,就跟你说#11 正确了
    yudoo
        23
    yudoo  
       282 天前
    chatgpt 问下比这快, 这两天刚写个脚本批量查询 mybatis 更新的表 插入的表和新增的表, 然后更新的语句批量添加更新时间, chatgpt 给的稍微改改就能用
    QYJ
        24
    QYJ  
       282 天前
    @laters 我不是写 javascirpt 的 ,但是我试了一下
    请这样写: [/ \bStop\b /, "custom-keyword"] 你好像是因为没有空格
    这是我测试的内容:value: `213Stop Stop 213Stop Stop213 1Stop1`
    QYJ
        25
    QYJ  
       282 天前
    @QYJ 不对,我这样是因为匹配了空格,抱歉
    QYJ
        26
    QYJ  
       282 天前
    @laters
    正常都是用 \bStop\b ,我在其他地方测试都是可以的,但是你用起来效果确实不对,不知道为什么
    你可以这样写: [/\WStop\W/, "custom-keyword"],
    测试的内容:value: `Stop 213Stop Stop Stop213 1Stop1`,
    laters
        27
    laters  
    OP
       282 天前
    @yudoo 已经问了 N 次,4 都不对
    laters
        28
    laters  
    OP
       282 天前
    @QYJ #26 好的 我尝试下
    QYJ
        29
    QYJ  
       282 天前
    @laters 还是有点问题,只能匹配中间的 Stop,开始和最后的 Stop 不能用
    我试了好多正则都和预期不同,我怀疑这个在线环境问题有点大,建议别整下去了
    laters
        30
    laters  
    OP
       282 天前
    @QYJ #29 对的, 这就是问题, 很奇怪
    xwh
        31
    xwh  
       282 天前
    [/^Stop$/, "custom-keyword"]
    这样?
    yudoo
        32
    yudoo  
       278 天前
    @laters 解决了吗。可以的话可以远程看下 v:luxus1727
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2726 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 07:55 · PVG 15:55 · LAX 23:55 · JFK 02:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.