我如何用regex來分割下面的內容。
'abcd1234567ef' in into 'abcd', '1234567', 'ef'.
'abcd1234567.89ef' into 'abcd', '1234567.89', 'ef'
我需要在Postgres SQL中分割一個字串,其中可能有也可能沒有小數。
我已經試過這個SELECT regexp_match('abcd1234567ef', '(?:(.*?)(d )(.*)){1,1}');從Postgres檔案中,只對第一種情況有效。
編輯:在使用rewritten的答案后,有一些列的資料的形式為
'abcd12efg34567hij''abcd', '12, 'efg', '34567', 'hij' 或
'abcd', '12efg', '34567', 'hij'。
這兩種方法對我來說都是可行的
uj5u.com熱心網友回復:
你需要轉義這個點,否則它意味著 "任何字符"。
用于匹配和捕獲數字部分的重構運算式是:
(d (?:.d )?
注意到可選的 "點和數字",它與一對非捕獲的括號組合在一起。
為了匹配一個子串,你可以使用regexp_match,如果你有多個子串,你將需要regexp_matches(data, regexp, 'g'),這將回傳多行。如果您只需要一行,請與ARRAY_AGG相結合。
這個例子abcd12efg34567hij將得到:
SELECT regexp_matches('abcd12efg34567hij', 'd ( ? :.d )?', 'g')
12)
34567[/span]。
SELECT array_agg(regexp_matches('abcd12efg34567hij', 'd (? :.d )?', 'g')
{12, 34567}。
如果你還需要中間件,你需要使用更多的捕獲組:
如果你還需要中間件,你需要使用更多的捕獲組。
([^d]*)(?:(d (?:.d )?)([^d]*))*。
([^d]*) // 第一組非數字
(?: //非抓取組
(d (?:.d )?) //第2、4、6......組有一個點的數字
([^d]*) // 第3、5、7、...組非數字
)*//結束分組,重復0次或更多次
(為了清晰起見,添加了空格、換行符和逗號,它們不應該出現在regexp中)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/323784.html
標籤:
