Oracle regexp - удаление конечного подчеркивания и чисел из строки - PullRequest
1 голос
/ 07 сентября 2011

У меня есть такие значения: aaa_1, bb_5, c_21, a_b.Теперь мне нужно удалить конечное подчеркивание и цифры из этого значения.A_b (string_string) является допустимым значением и не нуждается в удалении.По сути, мне нужно регулярное выражение ptern для извлечения только завершающего _ [любое количество цифр] из строки.

Я использую Oracle 11gR2

Любое предложение?

Ответы [ 2 ]

4 голосов
/ 07 сентября 2011

Вам необходимо использовать REGEXP_REPLACE с выражением регулярного выражения '\ _ [[: digit:]] {1,}'

Это переводит, чтобы найти (экранированное) подчеркивание с одной или несколькими цифрами после него:

, например

SELECT REGEXP_REPLACE('a_b', '\_[[:digit:]]{1,}'),
       REGEXP_REPLACE('aaa_1', '\_[[:digit:]]{1,}'),
       REGEXP_REPLACE('c_21', '\_[[:digit:]]{1,}'),
       REGEXP_REPLACE('bb_5', '\_[[:digit:]]{1,}')
  FROM dual;

Возвращает

a_b
aaa
c
bb

Если вы хотите удостовериться, что удаляете подчеркивание и цифры только тогда, когда нет буквенных символов, то добавьте $ в конец строки регулярного выражения, чтобы обозначить конец строки.

например. Первый с "$", второй без

SELECT REGEXP_REPLACE('bb_5b', '\_[[:digit:]]{1,}$'),
       REGEXP_REPLACE('bb_5b', '\_[[:digit:]]{1,}'),
       REGEXP_REPLACE('bb_55', '\_[[:digit:]]{1,}$'),
       REGEXP_REPLACE('bb_55', '\_[[:digit:]]{1,}')
  FROM dual;

Возвращает

bb_5b
bbb
bb
bb

Регулярные выражения могут быть неудобными, но эта ссылка является одной из самых простых для понимания, которую я нашел для выражений регулярных выражений Oracle: http://www.dba -oracle.com / t_regular_expressions.htm

Надеюсь, это поможет.

0 голосов
/ 07 сентября 2011

Вот еще одна версия, которая будет игнорировать любые значения, начинающиеся с цифр, если они у вас есть.Тот же базовый подход, что и для Олли, но учитывает первую часть значения, чтобы убедиться, что это буквы.Он захватывает обе части значения и заменяет его первой частью, если она соответствует вашим критериям.

select
  regexp_replace('A_1', '([A-Za-z]+)(\_\d+)', '\1'),
  regexp_replace('A_B', '([A-Za-z]+)(\_\d+)', '\1'),
  regexp_replace('cc_21', '([A-Za-z]+)(\_\d+)', '\1'),
  regexp_replace('1_1', '([A-Za-z]+)(\_\d+)', '\1')
 from dual;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...