簡體   English   中英

需要從文件名中提取字符串

[英]Need to extract a string from a filename

我在臨時表中有一個列,我在其中插入文件名。 文件名的格式如下:

T225674_<suppliercode><YYYYMMDD>-<HHMM>_**<TIMBE NUMBER>**.in

例子:

T225674_789020161010-0900_12345.in

(我需要從上面的字符串中提取 12345,字符串可以是任何長度的任何東西)

我需要從上面的文件名中提取<TIMBE NUMBER> ,能否請您告訴我們如何在 Oracle SQL 中執行此操作。

謝謝

我確信有一個正則表達式可以做到這一點,但這不是我的強項。 但是,instr 和 substr 的組合會讓你到達那里:

substr(string, instr(string, '_', -1) + 1, instr(string, '.') - instr(string, '_', -1) - 1))

@Rene 完美地回答了這個問題,但為了完整起見,這里有一個 Regex_substr 解決方案。

答案的更改版本。

    select 
            regexp_substr('T225674_789020161010-0900_12345.in', '(.*?_){2}(.*?)\.', 1, 1, '', 2) 
    from dual

(.*?_){2} - 第二個下划線之后的任何內容

(.*?)\\.' - 小數點前的任何內容

為了更加完整(對 user3240704 眨眼),這里有一個更簡單、更有效的正則表達式解決方案。 即使這會比 Rene 的解決方案慢。

使用 OP 提供的信息:要搜索的數字前面是下划線,后面是確切的字符串'.in' (如果該信息不正確,則解決方案將失敗)。

select regexp_substr(input_string, '_(\d+)\.in$', 1, 1, null, 1) from....

這將搜索下划線,后跟一個或多個數字(\\d 表示數字,+ 表示一個或多個),然后是句點(轉義:. 因為在正則表達式中 . 本身表示“任何字符),然后是 'in ',后跟字符串的結尾 - 因此搜索模式錨定在輸入字符串的末尾。

\\d+放在括號中使其成為可以在regexp_substr()函數中引用的“子表達式”。 第六個參數 1 表示“返回匹配子字符串中第一個子表達式的子字符串”。

regexp_replace的解決方案:

SELECT regexp_replace(a,'(T225674_.*_)(.*)(\.in)' ,'\2') from (
  select 'T225674_789020161010-0900_12345.in' a from dual
)

第一部分(T225674_.*_)匹配以T225674_ ,以_結尾的任何內容。 然后為接下來的內容留出空間,直到結束組(.in) :這是第二組(.*)的目的。

使用regexp_replace ,您可以使用匹配組的內容。 這里我只用\\2打印組 n°2 的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM