在Informatica中使用REG_MATCH和REPLACESTR函数移除后缀字符
正确移除姓名后缀的正则匹配与替换方案
问题根源
你当前的代码问题出在REPLACESTR的使用上:直接替换单个字符(比如'I')会触发全局替换,把字符串中所有匹配的字符都删掉,而非仅删除作为后缀的部分。比如FINANCIAL里的'I'会被误删,导致输出FNANCAL。
解决方案思路
要精准移除后缀,需做到两点:
- 用
REG_MATCH精准定位后缀:区分末尾后缀(如... I)和中间后缀(如... I ...),确保只匹配作为后缀的空格+标识组合; - 用
REPLACESTR替换后缀整体:针对末尾后缀替换空格+标识为空,针对中间后缀替换空格+标识+空格为单个空格(避免连续空格)。
修改后的代码
--parse suffix txt from last name IIF(REG_MATCH(LAST_NAME,'\sI$') OR REG_MATCH(LAST_NAME,'\sI\s'), REPLACESTR(1, LAST_NAME, CASE WHEN REG_MATCH(LAST_NAME,'\sI$') THEN '\sI' ELSE '\sI\s' END, CASE WHEN REG_MATCH(LAST_NAME,'\sI$') THEN '' ELSE ' ' END), IIF(REG_MATCH(LAST_NAME,'\sII$') OR REG_MATCH(LAST_NAME,'\sII\s'), REPLACESTR(1, LAST_NAME, CASE WHEN REG_MATCH(LAST_NAME,'\sII$') THEN '\sII' ELSE '\sII\s' END, CASE WHEN REG_MATCH(LAST_NAME,'\sII$') THEN '' ELSE ' ' END), IIF(REG_MATCH(LAST_NAME,'\sIII$') OR REG_MATCH(LAST_NAME,'\sIII\s'), REPLACESTR(1, LAST_NAME, CASE WHEN REG_MATCH(LAST_NAME,'\sIII$') THEN '\sIII' ELSE '\sIII\s' END, CASE WHEN REG_MATCH(LAST_NAME,'\sIII$') THEN '' ELSE ' ' END), IIF(REG_MATCH(LAST_NAME,'\sIV$') OR REG_MATCH(LAST_NAME,'\sIV\s'), REPLACESTR(1, LAST_NAME, CASE WHEN REG_MATCH(LAST_NAME,'\sIV$') THEN '\sIV' ELSE '\sIV\s' END, CASE WHEN REG_MATCH(LAST_NAME,'\sIV$') THEN '' ELSE ' ' END), IIF(REG_MATCH(LAST_NAME,'\sV$') OR REG_MATCH(LAST_NAME,'\sV\s'), REPLACESTR(1, LAST_NAME, CASE WHEN REG_MATCH(LAST_NAME,'\sV$') THEN '\sV' ELSE '\sV\s' END, CASE WHEN REG_MATCH(LAST_NAME,'\sV$') THEN '' ELSE ' ' END), IIF(REG_MATCH(LAST_NAME,'\sJR$') OR REG_MATCH(LAST_NAME,'\sJR\s'), REPLACESTR(1, LAST_NAME, CASE WHEN REG_MATCH(LAST_NAME,'\sJR$') THEN '\sJR' ELSE '\sJR\s' END, CASE WHEN REG_MATCH(LAST_NAME,'\sJR$') THEN '' ELSE ' ' END), IIF(REG_MATCH(LAST_NAME,'\sJR\.$') OR REG_MATCH(LAST_NAME,'\sJR\.\s'), REPLACESTR(1, LAST_NAME, CASE WHEN REG_MATCH(LAST_NAME,'\sJR\.$') THEN '\sJR\.' ELSE '\sJR\.\s' END, CASE WHEN REG_MATCH(LAST_NAME,'\sJR\.$') THEN '' ELSE ' ' END), IIF(REG_MATCH(LAST_NAME,'\sSR$') OR REG_MATCH(LAST_NAME,'\sSR\s'), REPLACESTR(1, LAST_NAME, CASE WHEN REG_MATCH(LAST_NAME,'\sSR$') THEN '\sSR' ELSE '\sSR\s' END, CASE WHEN REG_MATCH(LAST_NAME,'\sSR$') THEN '' ELSE ' ' END), IIF(REG_MATCH(LAST_NAME,'\sSR\.$') OR REG_MATCH(LAST_NAME,'\sSR\.\s'), REPLACESTR(1, LAST_NAME, CASE WHEN REG_MATCH(LAST_NAME,'\sSR\.$') THEN '\sSR\.' ELSE '\sSR\.\s' END, CASE WHEN REG_MATCH(LAST_NAME,'\sSR\.$') THEN '' ELSE ' ' END), IIF(REG_MATCH(LAST_NAME,'\s3RD$') OR REG_MATCH(LAST_NAME,'\s3RD\s'), REPLACESTR(1, LAST_NAME, CASE WHEN REG_MATCH(LAST_NAME,'\s3RD$') THEN '\s3RD' ELSE '\s3RD\s' END, CASE WHEN REG_MATCH(LAST_NAME,'\s3RD$') THEN '' ELSE ' ' END), LAST_NAME))))))))))
关键细节说明
- 正则匹配规则:
\sI$:匹配末尾的空格+I($表示字符串结尾);\sI\s:匹配中间被空格包围的空格+I+空格;
- 替换逻辑:
- 末尾后缀:替换
空格+标识为空,直接移除后缀; - 中间后缀:替换
空格+标识+空格为单个空格,避免删除后出现连续空格;
- 末尾后缀:替换
- 对II、III、JR.等后缀采用完全一致的逻辑,确保所有后缀都能精准移除且不影响主字符串内容。
内容的提问来源于stack exchange,提问作者karthik
相关产品推荐
相关产品推荐

