Teradata - убрать цифры и некоторые знаки препинания, оставить альфа и другие знаки препинания - PullRequest
0 голосов
/ 15 июня 2019

Мне нужно очистить поле имени в Teradata.Некоторые записи хороши:

  • Белчер, Боб Х.
  • Белчер, Линда А.
  • Песто, Джимми З.

У других также есть числа, точка с запятой и фунт / хэш:

  • 372; # Fishoder, Calvin Z.
  • 5907; # Fishoder, Felix W.
  • 43;#Francisco, Teddy A.

2-й набор примеров - это то, что мне нужно очистить, но оставить запятую между фамилией и именем и точкой после среднего инициала.

Я предполагаю, что REGEX_REPLACE - это то, что мне нужно, но я не могу найти примеры того, что я пытаюсь сделать.

Ответы [ 2 ]

2 голосов
/ 15 июня 2019

Regexp_replace ваш друг здесь. Вы можете заменить несколько символов, поместив их в квадратные скобки. Так что если вы хотите заменить # или ; или любой числовой символ:

select
regexp_replace('AB,;#123','[;#0-9]','',1,0,'i')

В этом прекрасном вымышленном примере вы вернетесь AB,. Мы удалили точку с запятой и цифры.

Запуск с одним из ваших примеров:

select
regexp_replace('372;#Fishoder, Calvin Z.','[;#0-9]','',1,0,'i')

возвращает нас Fishoder, Calvin Z.

1 голос
/ 15 июня 2019

Здесь мы можем начать с левой границы [A-Z], затем собрать фамилию, запятую и остаток нашей строки с выражением, похожим на:

(([A-Z].+)?,)\s*(.+)

Демо

Схема RegEx

jex.im визуализирует регулярные выражения:

enter image description here

Группы захвата

const regex = /(([A-Z].+)?,)\s*(.+)/gm;
const str = `372;#Fishoder, Calvin Z.
5907;#Fishoder, Felix W.
43;#Francisco, Teddy A.
Belcher, Bob X.
Belcher, Linda A.
Pesto, Jimmy Z.`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}
...