PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Dapatkan kecocokan kedua dari hasil regexp_matches

Anda dapat menggunakan REGEXP_REPLACE :

SELECT REGEXP_REPLACE('1234567 - 7654321 - some - more - text', '^\d+[^\d]+(\d+).*$', '\1');

Keluaran

7654321

Regexp ini mencari string yang dimulai dengan sejumlah digit (^\d+ ) diikuti oleh beberapa karakter non-digit ([^\d]+ ) dan kemudian grup digit lainnya ((\d+) ) diikuti oleh beberapa karakter hingga akhir string (.*$ ). () di sekitar grup karakter digit kedua menjadikannya grup penangkap, yang kemudian dapat kita rujuk dalam string pengganti dengan \1 . Sejak REGEXP_REPLACE hanya mengganti bagian dari string yang cocok dengan ekspresi reguler, perlu memiliki ekspresi reguler yang cocok dengan keseluruhan string untuk menggantinya hanya dengan data yang diinginkan.

Perbarui

Jika ada kemungkinan karakter sebelum kumpulan digit pertama, Anda harus mengubah ekspresi reguler menjadi

^[^\d]*\d+[^\d]+(\d+).*$

Perbarui 2

Jika mungkin hanya ada satu set angka di awal, kita harus membuat pencocokan bagian pertama opsional. Kita dapat melakukannya dengan grup yang tidak menangkap:

^[^\d]*(?:\d+[^\d]+)?(\d+).*$

Ini membuat kecocokan pada set digit pertama opsional sehingga jika tidak ada (yaitu hanya ada satu set digit) regex akan tetap cocok. Dengan menggunakan grup yang tidak menangkap (menambahkan ?: ke awal grup, kita tidak perlu mengubah string pengganti dari \1 . SQLFiddle telah diperbarui



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Postgres :Tidak ditemukan Driver yang cocok untuk jdbc

  2. pertanyaan postgresql nextval tentang urutan

  3. Pembuatan urutan berurutan

  4. Bagaimana cara memanggil prosedur PostgreSQL di Jawa?

  5. Mengapa postgresql tidak menggunakan indeks dalam kueri ini?