2016-09-13 325 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