正则表达式 - 最后一个句点和最后一个下划线之间的所有内容

3
我将尝试编写一个正则表达式,捕获最后一个句点之后直到第三个下划线之前的所有内容(不包括第三个下划线)。
例如:
ABC_Simple_DEF.dbo.GDE_1_1_Contact_test

应该返回 GDE_1_1

我尝试了使用 [^.]+$ ,它包括了最后一个句点之后的所有内容。 表达式 _[^_]+$ 包括了最后一个下划线和之后的所有内容,这已经很接近了,但并不完全符合我的需求。

我有些困惑,希望能得到一些帮助。

4个回答

2

You may use

[^._]+(?:_[^._]+){2}(?=_[^.]*$)

最初的回答:或者,采用捕获方法(您需要从结果中获取第1组值):
([^._]+(?:_[^._]){2})_[^.]*$

请看正则表达式演示 #1正则表达式演示 #2细节
  • [^._]+ - 匹配除了._之外的1个或多个字符。
  • (?:_[^._]+){2} - 重复两次:
    • _ - 下划线
    • [^._]+ - 匹配除了._之外的1个或多个字符。
  • (?=_[^.]*$) - 正向前瞻,要求当前位置右侧紧接着_以及0个或多个除了.之外的字符,直到字符串结束。

"Original Answer"翻译成"最初的回答"。

1
完美,正是我所需要的。谢谢! - Flimzy_Programmer

0
如果支持负向先行断言,一种选择是断言左侧为点,并使用负向先行断言来断言匹配后没有更多的点:
(?<=\.)(?!.*\.)(?:[^_]+_){2}[^_]+

解释

  • (?<=\.) 否定后顾,断言左侧直接跟的不是一个点号.
  • (?!.*\.) 否定先行,断言后面没有更多的点号.
  • (?: 非捕获组
    • [^_]+_ 匹配一次或多次不是下划线_然后是一个下划线_
  • ){2} 关闭非捕获组并重复两次
  • [^_]+ 匹配一次或多次不是_

正则表达式演示


0
一个稍微变化的Wiktor答案,需要一个最后的句点,并捕获第三个下划线之前的所有内容,或者如果少于三个则捕获到结尾(为了清晰起见,省略了非捕获组,测试here)。
\.([^._]*(_[^._]*){0,2})[^.]*$

目标捕获组是1。为了更好地可视化,假设您的输入仅包含下划线、句点和字符c,那么它变成:
\.(c*(_c*){0,2})c*$

0

直接的“愚蠢”正则表达式是:

([^.]*\.)*([^_]*_[^_]*_[^_]*).*

你需要组 \1

测试 这里


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接