2016-09-22 15 views
1

文字列の途中で数字を返すためにregexp_replaceを実行する方法がわかりません。文字列正規表現の途中の数字を返します

私の現在の文字列は「Game of Thrones S2 Ep6」で、これからシーズン番号を返す必要があります。私の現在の正規表現は正しく仕事をしていませんが、2つの正規表現式を取ります。私たちの生活S26の日」

"ヤング・スーパーマンS 10 Epの12"

を:他のいくつかのテスト項目がある

REGEXP_REPLACE(REGEXP_REPLACE('Game of Thrones S1 Ep12', r'(^[^_]*\sS)', ''), r'(\s*Ep\s*\d*\s*$)', '') 

をEp324 "

この最初の文字は、最初の" S "までのテキストを取り除きます。 その後、 "Ep"の前に空白を含む文字列の最後を分割します

誰かが私にこのことを1回の置換で行うことができるようにしてください。これは現時点では非常にコストのかかるクエリです。

+0

を返す私は理解していないことである - なぜ*全ての*アプローチを置き換えますか? '\ bS \ s *(\ d +)\ s * Ep'のような正規表現でシーズン番号をキャプチャしてみませんか? – ClasG

答えて

2

はシーズン番号(\d+)周りのキャプチャグループを使用し、後方参照('\1')と交換してください:

REGEXP_REPLACE('Game of Thrones S1 Ep12', r'^[^\n_]*\sS\s*(\d+)\s*Ep\s*\d*\s*$', r'\1') 

は、私はちょうどあなた自身の正規表現を拡張しています、あなたもしたいかもしれませんthis regex demo

ノートを参照してください。 r'^.*\sS\s*(\d+).*'正規表現に最後のスペース+ Sが後に1つ以上の数字が付くようにしてください。

はあなたがREGEXP_EXTRACT機能、ないREGEXP_REPLACEを使用する必要がregex demo

+0

申し訳ありませんが、デモのリンクが壊れていて、今修正しました。 –

1

を参照してください。標準SQLで 、クエリの例は次のようになります。

select regexp_extract(text, r'[sS][ ]*(\d+)') from (
select text from unnest(["Smallville S 10 Ep 12", "The Days of Our Lives S26 Ep324"]) text) 

、それは

Row f0_ 
1 10 
2 26