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
name
again_name
etc_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
- 单词边界(用于确保后面的前瞻只能执行一次,以防止回溯到捕获的单词模式
(?!\(\))
- 无法匹配当前位置右侧紧邻 ()
文本的否定前瞻。
我有那些字符串示例(以特定字符串开头:(例如:S
,然后是蛇形大小写,由 .
分隔,有时后跟 ()
):
T.name.other_name.another_name
T.name.again_name.ect_name.last_name()
我正在尝试使用 RegExp 来匹配所有蛇形格部分(没有 .
)但不是最后一个,如果它后面是 ()
。
所以匹配应该是:
name
other_name
another_name
name
again_name
etc_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
- 单词边界(用于确保后面的前瞻只能执行一次,以防止回溯到捕获的单词模式(?!\(\))
- 无法匹配当前位置右侧紧邻()
文本的否定前瞻。