RegExp - 如果后面跟着什么,如何匹配除最后一个以外的所有内容?

RegExp - How to match all except the last one if it is followed by something?

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

T.name.other_name.another_name

T.name.again_name.ect_name.last_name()

我正在尝试使用 RegExp 来匹配所有蛇形格部分(没有 .)但不是最后一个,如果它后面是 ()

所以匹配应该是:

name other_name another_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

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

总的来说,最简单的方法是进行一次完全匹配,然后拆分结果
在期间捕获组 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_]* \( \) )

这里是你需要在Highlight Visual Studio代码扩展设置中使用的:

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

演示突出显示:

参见regex demo

备注:

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

正则表达式详细信息:

  • (?<=\bT(?:\.[a-z_]+)*\.) - 正后视匹配紧跟在整个单词 T 之前的位置(\b 是单词边界)后跟零次或多次出现的 . 和一个或多个小写 ASCII 字母或 _s,然后是 . 字符
  • ([a-z_]+) - 捕获第 1 组:一个或多个小写 ASCII 字母或 _ 个字符
  • \b - 单词边界(用于确保后面的前瞻只能执行一次,以防止回溯到捕获的单词模式
  • (?!\(\)) - 无法匹配当前位置右侧紧邻 () 文本的否定前瞻。