2016-09-13 329 views
0

这可能是直截了当的,但我甚至不知道我应该谷歌哪一句话来找到答案。原谅我的不高兴。正则表达式正则表达式返回的值正则表达式

我有串看起来像这样的(文件名):

site12345678_date20160912_23001_to_23100_of_25871.txt 

什么命名约定的意思是“记录23001 23100通过出25871站点12345678为2016年9月12日(20160912)”

我想要做的是提取的日期部分(_date及以下_之间的那些数字)

正则表达式:.*(_date[0-9]{8}).*将返回字符串_date20160912。但是我真正想要的只是20160912。很明显,[0-8]{8}不给我我想要的这种情况下,因为这可能与网站混淆,或可能记录计数

我怎样才能负责任地完成这种'子串'与一个正则表达式?

+0

只需使用捕获组:'/ _date([0-9] {8})/'来提取数字部分。如果您的目标平台具有此功能,则可以使用lookbehinds('/(?<= _ date)[0-9] {8} /')[[demo](https://regex101.com/r/wU1iU7/1)]。提示:JS没有。 – raina77ow

+0

你使用哪种语言? –

+0

你只需要重新调整圆括号 - '。* _ date([0-9] {8})。*' –

回答

0

您只需要移动圆括号,以便将捕获组从其中包括'_date'。然后,你会想寻找您的捕获组#1:

如果在Python实现,例如,它看起来是这样的:

import re 
regex = '.*_date([0-9]{8}).*' 
str = 'site12345678_date20160912_23001_to_23100_of_25871.txt' 
m = re.match(regex, str) 
print m.group(0) # the whole string 
print m.group(1) # the string you are looking for '20160912' 

看到它在这里的行动:https://eval.in/641446

+0

哦,哎呀。我应该首先尝试这一点。像Pentaho Spoon的魅力一样工作。谢谢! :) – Adam

0

正则表达式:.*(_date[0-9]{8}).*将返回字符串_date20160912

这意味着您在需要完整字符串匹配的方法中使用正则表达式,并且您可以访问组1的值。你需要在正则表达式来改变的唯一事情是捕获组位置:

.*_date([0-9]{8}).* 
     ^^^^^^^^^^ 

regex demo