正则表达式-上期与下划线之间的所有内容

时间:2019-07-05 08:35:36

标签: regex

我正试图制定一个正则表达式,以捕获上一个周期之后的所有内容,直到(不包括)该周期之后的下划线3。

例如:

ABC_Simple_DEF.dbo.GDE_1_1_Contact_test

应返回GDE_1_1

我尝试使用[^.]+$,它包括最后一个时期之后的所有内容。 表达式_[^_]+$包含最后一个下划线和其后的所有内容,这很接近,但不完全是我要查找的内容。

Kinda卡在这里,不胜感激

4 个答案:

答案 0 :(得分:1)

您可以使用

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

或者,捕获方法(您需要从结果中获取第1组的值):

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

请参见regex demo #1regex demo #2

详细信息

  • [^._]+-除._以外的1个以上的字符
  • (?:_[^._]+){2}-的两次重复
    • _-下划线
    • [^._]+-除._以外的1个以上的字符
  • (?=_[^.]*$)-正向超前,需要_.以外的0+个字符,直到当前位置右侧的字符串末尾为止。

答案 1 :(得分:0)

如果支持负向后看,则一种选择可能是断言左侧的点是点,然后使用负向前瞻来断言匹配的点后不再有点:

(?<=\.)(?!.*\.)(?:[^_]+_){2}[^_]+

说明

  • (?<=\.)后面是负号,则断言直接在左边的不是圆点
  • (?!.*\.)负前行,在其后断言不要再加点
  • (?:非捕获组
    • [^_]+_匹配1次以上而不是下划线,然后匹配_
  • ){2}关闭非捕获组并重复2次
  • [^_]+匹配1次以上而不是_

Regex demo

答案 2 :(得分:0)

Wiktor的答案略有不同,需要最后一个句点,并捕获所有内容,直到第三个下划线为止;如果少于三个下划线,则捕获所有内容(为了清晰起见,丢弃了非捕获组,请测试here):

\.([^._]*(_[^._]*){0,2})[^.]*$

目标捕获组为1。为了更好地显示,假设您的输入仅包含下划线,句点和字符c,则它变为:

\.(c*(_c*){0,2})c*$

答案 3 :(得分:0)

直接的“哑”正则表达式为:

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

并且您需要组\1

测试here