PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Uzyskaj drugie dopasowanie z wyników regexp_matches

Możesz użyć REGEXP_REPLACE :

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

Wyjście

7654321

To wyrażenie regularne szuka łańcucha zaczynającego się od pewnej liczby cyfr (^\d+ ) po którym następuje kilka znaków niebędących cyframi ([^\d]+ ), a następnie kolejna grupa cyfr ((\d+) ), po której następuje pewna liczba znaków do końca ciągu (.*$ ). () wokół drugiej grupy znaków cyfrowych sprawia, że ​​jest to grupa przechwytywania, do której możemy następnie odwołać się w ciągu zastępczym za pomocą \1 . Od REGEXP_REPLACE zastępuje tylko te części ciągu, które pasują do wyrażenia regularnego, konieczne jest posiadanie wyrażenia pasującego do całości string, aby zastąpić go tylko żądanymi danymi.

Aktualizacja

Jeśli przed pierwszym zestawem cyfr potencjalnie znajdują się znaki, należy zmienić wyrażenie regularne na

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

Aktualizacja 2

Jeśli jest możliwe, że na początku jest tylko jeden zestaw liczb, musimy sprawić, by dopasowanie pierwszej części było opcjonalne. Możemy to zrobić z grupą nieprzechwytującą:

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

To sprawia, że ​​dopasowanie pierwszego zestawu cyfr jest opcjonalne, więc jeśli nie istnieje (tj. jest tylko jeden zestaw cyfr), wyrażenie regularne nadal będzie pasować. Używając grupy nieprzechwytującej (dodając ?: na początek grupy, nie musimy zmieniać ciągu zastępczego z \1 . Zaktualizowano SQLFiddle



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Daty przyrostowe PostgreSQL?

  2. Tworzenie emacsa do domyślnego podświetlania składni postgresql

  3. Jak wygenerować schemat z pliku CSV dla kopii PostgreSQL?

  4. Postgres 9.5 ON KONFLIKT WYBIERZ

  5. Jak uzyskać id wiersza, który został wybrany przez funkcję agregującą?