PostgreSQL regexp.replace所有不需要的字符
我的PostgreSQL表中有一些写得很乱的注册码,比如MU-321-AB、MU/321/AB、MU 321-AB等等……PostgreSQL regexp.replace所有不需要的字符,postgresql,Postgresql,我的PostgreSQL表中有一些写得很乱的注册码,比如MU-321-AB、MU/321/AB、MU 321-AB等等…… 我需要清除所有这些才能得到MU321AB 为此,我使用以下表达式: SELECT DISTINCT regexp_replace(ccode, '([^A-Za-z0-9])', ''), ... 此表达式在“NET”中按预期工作,但在PostgreSQL中不按预期工作,因为它只“清除”第一次出现的不需要的字符 如何修改正则表达式以替换字符串中所有不需要的字符,从而只使用
我需要清除所有这些才能得到MU321AB 为此,我使用以下表达式:
SELECT DISTINCT regexp_replace(ccode, '([^A-Za-z0-9])', ''), ...
此表达式在“NET”中按预期工作,但在PostgreSQL中不按预期工作,因为它只“清除”第一次出现的不需要的字符
如何修改正则表达式以替换字符串中所有不需要的字符,从而只使用字母和数字获得清晰的代码?使用
g
lobal标志,但不使用任何捕获组:
SELECT DISTINCT regexp_replace(ccode, '[^A-Za-z0-9]', '', 'g'), ...
请注意,全局标志是标准正则表达式解析器的一部分,因此在本例中.NET不遵循标准。另外,由于您不希望从字符串中提取任何内容-您只想替换一些字符-因此不应使用捕获组
()
嗨,Patrick谢谢您的回答。我删除了“捕获组”,添加了一个“g”标志,这个示例正如预期的那样运行良好。但还有一个问题出现。postgreSQL的正则表达式是否可以是unicode的,这样它就可以使用诸如“ü”、“š”之类的字符?如果可以,正则表达式会是什么样子?是的,这可以通过在模式字符串中使用相关字符的代码点来实现,例如\u00F3
表示“ü”,而\u0161
表示“š”。但你会明白这很快就会变得相当乏味。有关更多通用(非PG特定)信息,请参见。我特别不知道Unicode脚本或块是否可以在PG中工作,这样您就可以一次性匹配所有拉丁扩展字符。好的,再次感谢。我在模式中添加了上下unicodes,出于我的实际目的,这项工作做得很好。我真的需要读一些关于正则表达式的书。。。