PostgreSQL如何检测文本字段中的特殊字符、多余空白等内容?
PostgreSQL正则修正方案:精准检测指定特殊字符并统计次数
问题根源
你之前的SQL返回无关记录,是因为正则表达式范围太宽泛(比如误用\W匹配非单词字符,会包含点号、逗号等正常符号),或者错误匹配了单个空格这类合法内容。以下是精准匹配目标内容的修正方案:
精准正则表达式
针对你需要检测的内容,构建严格匹配的正则,只包含指定特殊符号和异常空白:
([''`"<>’+{}&|\\/]|\t{2,}|\r|\n| {2,})
各部分说明:
[''"<>’+{}&|\/]:匹配单引号、双引号、反引号、<、>、撇号、+、{}、&、|、正反斜杠(注意PostgreSQL中单引号用''转义,反斜杠用\`转义)\t{2,}:匹配2个及以上连续制表符(多余制表符)\r|\n:匹配回车、换行符{2,}:匹配2个及以上连续空格(对应单词间的多个空格)
实用SQL示例
1. 筛选包含目标内容的记录
SELECT your_text_column FROM your_table WHERE your_text_column ~ '([''`"<>’+{}&|\\/]|\t{2,}|\r|\n| {2,})';
2. 统计每条记录的目标内容总出现次数
SELECT your_text_column, regexp_count(your_text_column, '([''`"<>’+{}&|\\/]|\t{2,}|\r|\n| {2,})', 'g') AS total_occurrences FROM your_table WHERE your_text_column ~ '([''`"<>’+{}&|\\/]|\t{2,}|\r|\n| {2,})';
'g'参数表示全局匹配,统计所有出现次数而非仅第一次
3. 分类型统计各内容出现次数
如果需要单独统计每种内容的次数,可以拆分正则:
SELECT your_text_column, regexp_count(your_text_column, '[''`"<>’+{}&|\\/]', 'g') AS special_chars_count, regexp_count(your_text_column, '\t{2,}', 'g') AS extra_tabs_count, regexp_count(your_text_column, '[\r\n]', 'g') AS line_breaks_count, regexp_count(your_text_column, ' {2,}', 'g') AS extra_spaces_count, -- 总次数 (regexp_count(your_text_column, '[''`"<>’+{}&|\\/]', 'g') + regexp_count(your_text_column, '\t{2,}', 'g') + regexp_count(your_text_column, '[\r\n]', 'g') + regexp_count(your_text_column, ' {2,}', 'g')) AS total_count FROM your_table WHERE your_text_column ~ '([''`"<>’+{}&|\\/]|\t{2,}|\r|\n| {2,})';
内容的提问来源于stack exchange,提问作者j20152012
相关产品推荐
相关产品推荐

