我正试图制定一个正则表达式,以捕获上一个周期之后的所有内容,直到(不包括)该周期之后的下划线3。
例如:
ABC_Simple_DEF.dbo.GDE_1_1_Contact_test
应返回GDE_1_1
。
我尝试使用[^.]+$
,它包括最后一个时期之后的所有内容。
表达式_[^_]+$
包含最后一个下划线和其后的所有内容,这很接近,但不完全是我要查找的内容。
Kinda卡在这里,不胜感激
答案 0 :(得分:1)
您可以使用
[^._]+(?:_[^._]+){2}(?=_[^.]*$)
或者,捕获方法(您需要从结果中获取第1组的值):
([^._]+(?:_[^._]){2})_[^.]*$
请参见regex demo #1和regex demo #2。
详细信息
[^._]+
-除.
和_
以外的1个以上的字符(?:_[^._]+){2}
-的两次重复
_
-下划线[^._]+
-除.
和_
以外的1个以上的字符(?=_[^.]*$)
-正向超前,需要_
和.
以外的0+个字符,直到当前位置右侧的字符串末尾为止。答案 1 :(得分:0)
如果支持负向后看,则一种选择可能是断言左侧的点是点,然后使用负向前瞻来断言匹配的点后不再有点:
(?<=\.)(?!.*\.)(?:[^_]+_){2}[^_]+
说明
(?<=\.)
后面是负号,则断言直接在左边的不是圆点(?!.*\.)
负前行,在其后断言不要再加点(?:
非捕获组
[^_]+_
匹配1次以上而不是下划线,然后匹配_
){2}
关闭非捕获组并重复2次[^_]+
匹配1次以上而不是_
答案 2 :(得分:0)
Wiktor的答案略有不同,需要最后一个句点,并捕获所有内容,直到第三个下划线为止;如果少于三个下划线,则捕获所有内容(为了清晰起见,丢弃了非捕获组,请测试here):
\.([^._]*(_[^._]*){0,2})[^.]*$
目标捕获组为1。为了更好地显示,假设您的输入仅包含下划线,句点和字符c
,则它变为:
\.(c*(_c*){0,2})c*$
答案 3 :(得分:0)