正则如何完整匹配整个单词 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
laters
V2EX    正则表达式

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

  •  
  •   laters 2024-03-14 09:42:22 +08:00 3110 次点击
    这是一个创建于 644 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我有一个规则清单

    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  
       2024-03-14 11:13:15 +08:00
    不要贴代码,直接说规则
    wwwwaaanng
        2
    wwwwaaanng  
       2024-03-14 11:14:51 +08:00
    如何将其突出显示为仅用于停用词的关键字,如果前后有字母或单词,则不应突出显示
    没看懂你这句话想要什么规则
    InDom
        3
    InDom  
       2024-03-14 11:15:33 +08:00
    零宽断言
    A3m0n
        4
    A3m0n  
       2024-03-14 11:16:37 +08:00   1
    原文本单词和单词之间有空格分割吗?

    是这样的吗?

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

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

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

    PS: 我第一个回答理解错了题意,以为是要提取,但后来知道了要排除,就跟你说#11 正确了
    yudoo
        23
    yudoo  
       2024-03-14 16:59:01 +08:00
    chatgpt 问下比这快, 这两天刚写个脚本批量查询 mybatis 更新的表 插入的表和新增的表, 然后更新的语句批量添加更新时间, chatgpt 给的稍微改改就能用
    QYJ
        24
    QYJ  
       2024-03-14 17:10:36 +08:00
    @laters 我不是写 javascirpt 的 ,但是我试了一下
    请这样写: [/ \bStop\b /, "custom-keyword"] 你好像是因为没有空格
    这是我测试的内容:value: `213Stop Stop 213Stop Stop213 1Stop1`
    QYJ
        25
    QYJ  
       2024-03-14 17:14:09 +08:00
    @QYJ 不对,我这样是因为匹配了空格,抱歉
    QYJ
        26
    QYJ  
       2024-03-14 17:31:27 +08:00
    @laters
    正常都是用 \bStop\b ,我在其他地方测试都是可以的,但是你用起来效果确实不对,不知道为什么
    你可以这样写: [/\WStop\W/, "custom-keyword"],
    测试的内容:value: `Stop 213Stop Stop Stop213 1Stop1`,
    laters
        27
    laters  
    OP
       2024-03-14 17:41:35 +08:00
    @yudoo 已经问了 N 次,4 都不对
    laters
        28
    laters  
    OP
       2024-03-14 17:41:45 +08:00
    @QYJ #26 好的 我尝试下
    QYJ
        29
    QYJ  
       2024-03-14 17:47:57 +08:00
    @laters 还是有点问题,只能匹配中间的 Stop,开始和最后的 Stop 不能用
    我试了好多正则都和预期不同,我怀疑这个在线环境问题有点大,建议别整下去了
    laters
        30
    laters  
    OP
       2024-03-14 18:17:24 +08:00
    @QYJ #29 对的, 这就是问题, 很奇怪
    xwh
        31
    xwh  
       2024-03-15 10:12:34 +08:00
    [/^Stop$/, "custom-keyword"]
    这样?
    yudoo
        32
    yudoo  
       2024-03-18 21:28:44 +08:00
    @laters 解决了吗。可以的话可以远程看下 v:luxus1727
    关于     帮助文档 &nbs;   自助推广系统     博客     API     FAQ     Solana     5209 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 07:16 PVG 15:16 LAX 23:16 JFK 02:16
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86