【问题标题】:Match all instances of a character preceded by '/'匹配以 '/' 开头的字符的所有实例
【发布时间】:2021-05-24 04:38:03
【问题描述】:

例如,我可能有字符串

/zombie nimble zombie quick
Plants vs Zombies reference

我想匹配每个“e”,但只匹配短语“zombie nimble zombie quick”,因为它前面有一个正斜杠。

我可以使用\/.* 相当容易地获取前面带有正斜杠的字符串的内容。
我还可以将正确字符串中“e”的第一个实例与\/.*?\Ke匹配

但我想以一种对 VSCode 语法突出显示友好的方式匹配正确字符串中的每个 'e' 实例,这 afaik 是 .NET 风格

-果酱

【问题讨论】:

    标签: regex syntax-highlighting oniguruma


    【解决方案1】:

    如果您使用的是 PCRE,您可以尝试以下正则表达式:

    ^(?!\/).*(*SKIP)(*F)|e
    
    • ^(?!\/).* 一行不以 / 开头
    • (*SKIP)(*F)skips到目前为止消费的文本,也就是整行
    • |
    • e 匹配 e,如果 e 没有被跳过,则意味着它在以 / 开头的行内

    test cases


    编辑

    感谢简的建议。

    如果/ 并不总是从行首开始,你可以试试

    ^[^\/]*(*SKIP)(*F)|e
    

    test cases

    【讨论】:

    • 也许/ 不是从一开始就开始(然后使用否定。先行)但是为(*SKIP)(*FAIL) +1。请参阅this demo 以获取不是从行首开始的斜线。使用其他分隔符(例如~)也可以使用^(?!/)...,参见regex101.com/r/gseRUF/1
    • 我想接受这两个答案,因为它们都很好,但是这个也可以很容易地用于在 fwd 斜杠之后查找特定单词
    【解决方案2】:

    使用PCRE 你可以选择

    (?:\G(?!\A)|/)[^e\n]*\Ke
    

    a demo on regex101.com

    【讨论】:

    • ++ 用于\G 并保持OP的原始方法
    • 我最终在不同的表达式中使用它来匹配方法参数(?:\G|method\(|function\().*?\K(?:(["'])(?:(?<!\\)\\(?:\\\\)*\1|(?!\1).)*?\1|[^,\s=("']+)\s*(?=[,\)])
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-01
    • 1970-01-01
    • 2014-01-15
    • 2022-11-13
    • 2013-02-17
    • 1970-01-01
    相关资源
    最近更新 更多