【问题标题】:RegExp - How to match all except the last one if it is followed by something?RegExp - 如果后面跟着一些东西,如何匹配除最后一个之外的所有内容?
【发布时间】:2021-10-02 09:53:38
【问题描述】:

我有这些字符串示例(以特定字符串开头:(例如:S,然后是由. 分隔的蛇形大小写,有时后跟()):

T.name.other_name.another_name

T.name.again_name.ect_name.last_name()

我正在尝试使用正则表达式来匹配所有蛇案例部分(没有.),但如果后面跟着(),则不是最后一个。

所以匹配应该是:

nameother_nameanother_name

nameagain_nameetc_name(而不是last_name)。

但我找不到。 我该怎么做?


如果匹配项包括 . 也可以:

name.other_name.another_name

name.again_name.ect_name(但不是.last_name()


我试过这个正则表达式:

T((\.([a-z]|\_)*)*)(\.([a_z]|\_)\(\))?

并想提取第二组比赛,但它总是包含last_name

【问题讨论】:

  • 好吧,试试(?<=T(?:\\.[a-z_]+)*\\.)[a-z_]+\\b(?!\\(\\))(已经正确转义,不要加反斜杠)。
  • T(\.([a-z]|\_)+\b(?!\(\)))*(\.([a_z]|\_)+\(\))? 这是你的正则表达式,除了 \b 指定单词结束和 (?!()) 确保模式不跟随 ()
  • 如果上述方法不起作用,请尝试另一种模式,"(?:\\G(?!\\A)|T)\\.\\K[a-z_]+\\b(?!\\(\\))"。演示地址为regex101.com/r/u3RdTm/1regex101.com/r/u3RdTm/2
  • 简单的like this 还不够吗?
  • @Scratte VSCode 在不同的组件中使用了 3 种不同的正则表达式风格,所以还不是很清楚。但是,OP 共享的链接证明这不是 Rust 正则表达式。所以,要么是 JS,要么是 Onigmo/Oniguruma。我上面的一种模式应该可以工作,但我们不能 100% 确定。

标签: regex vscode-extensions


【解决方案1】:

这是您需要在 Highlight Visual Studio Code 扩展设置中使用的内容:

"(?<=\\bT(?:\\.[a-z_]+)*\\.)([a-z_]+)\\b(?!\\(\\))": { 
        "regexFlags": "g",
        "decorations":[ 
            { "color": "yellow" }
        ]
    }
}

演示突出显示:

请参阅regex demo

注意事项

  • "regexFlags": "g" 很重要,因为默认情况下突出显示是不区分大小写的。如果需要不区分大小写,请添加i
  • 确保正则表达式转义序列由双反斜杠构成。
  • 至少有一个捕获组:装饰应用于捕获组,您可以定义多少个组。
  • 正则表达式风格是 JavaScript,因此您可以使用无限长的后视模式。

正则表达式详细信息

  • (?&lt;=\bT(?:\.[a-z_]+)*\.) - 正向查找匹配一个位置,该位置紧跟在一个完整单词 T 之前(\b 是一个单词边界)后跟零个或多个 . 和一个或多个小写 ASCII 字母或 @ 987654331@s 然后是 . char
  • ([a-z_]+) - 捕获组 1:一个或多个小写 ASCII 字母或 _ 字符
  • \b - 单词边界(用于确保后面的前瞻只能执行一次,以防止回溯到捕获的单词模式中
  • (?!\(\)) - 一个否定的前瞻,匹配失败,在当前位置的右侧有 () 文本。

【讨论】:

  • 非常感谢您深入探讨这个问题,并如此详细地解释了答案
【解决方案2】:

如果您需要简单性,那么使用最少的单个断言
最后可能就是你所需要的。

不过,总体而言,最简单的方法是进行单个完全匹配,然后拆分结果
在周期的捕获组 1 中。

T\.((?:[a-z_]*\.)*[a-z_]*)(?![a-z_]*\(\))  

https://regex101.com/r/W89xxe/1

 T
 \. 
 (                             # (1 start)
    (?: [a-z_]* \. )*
    [a-z_]* 
 )                             # (1 end)
 (?! [a-z_]* \( \) )

【讨论】:

    猜你喜欢
    • 2017-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-03
    • 1970-01-01
    • 2013-04-18
    • 1970-01-01
    相关资源
    最近更新 更多