使用Postgres regexp_replace屏蔽查询字符串参数值

时间:2018-07-02 13:22:55

标签: sql regex postgresql

我想用PostgreSQL表列中的XXXXXXXX屏蔽电影名称。列的内容类似于

hollywood_genre_movieTitle0=The watergate&categorey=blabla&hollywood_genre_movieTitle1=Terminator&hollywood_genre_movieTitle2=Spartacus&hollywood_genre_movieTitle3=John Wayne and the Indians&categorey=blabla&hollywood_genre_movieTitle4=Start Trek&hollywood_genre_movieTitle5=ET&categorey=blabla

我想使用hollywood_genre_movieTitle\d函数掩盖标题(在模式regexp_replace后面)

regexp_replace('(hollywood_genre_movieTitle\d+=)(.*?)(&?)', '\1XXXXXXXX\3', 'g')

这只是替换标题的第一个出现并剪切字符串。简而言之,这种表达方式并不能满足我的要求。我想将所有电影名称都替换为XXXXXXXX

有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

该正则表达式不起作用,因为(.*?)(&?)匹配一个空字符串,或者&如果立即遵循hollywood_genre_movieTitle\d+=模式,则进入第3组。

您需要使用否定的字符类[^&]+量词来匹配&模式之后的hollywood_genre_movieTitle\d+=以外的任意1个或更多字符。

SELECT regexp_replace(
            'hollywood_genre_movieTitle0=The watergate&categorey=blabla&hollywood_genre_movieTitle1=Terminator&hollywood_genre_movieTitle2=Spartacus&hollywood_genre_movieTitle3=John Wayne and the Indians&categorey=blabla&hollywood_genre_movieTitle4=Start Trek&hollywood_genre_movieTitle5=ET&categorey=blabla',
            '(hollywood_genre_movieTitle\d+=)[^&]+', 
            '\1XXXXXXXX', 
            'g') 

请参见online demo

详细信息

  • (hollywood_genre_movieTitle\d+=)-捕获组1:
    • hollywood_genre_movieTitle-子字符串
    • \d+=-1个或多个数字,后跟一个=
  • [^&]+-除&以外的1个或多个字符。