PostgreSQL正则表达式查询报错求助:重复操作符前正则无效
解决PostgreSQL正则表达式错误:Invalid preceding regular expression prior to repetition operator
看起来你的正则表达式里有几个关键问题导致了这个错误,我帮你一步步拆解和修正:
1. 直接触发错误的原因:无效的重复操作符使用
错误提示里的>>>HERE>>>|+)s片段说明,你的正则里存在一个+重复操作符,它前面没有有效的匹配原子(也就是+紧跟在|分支分隔符后面,前面是空内容)。这是因为你可能在写匹配字面量加号的规则时,忘记了对+进行转义——在PostgreSQL默认使用的POSIX扩展正则中,+是特殊的重复操作符(表示匹配前面的原子1次或多次),要匹配实际的加号字符必须用\+转义。
2. 隐藏的逻辑问题:单词边界的错误使用
你用了\b来表示单词边界,但在PostgreSQL的POSIX正则语法里,\b匹配的是退格字符(ASCII 8),完全不是你想要的单词边界效果。如果要匹配单词开头的D,应该用[[:<:]](POSIX标准的单词起始边界);如果需要匹配单词结尾,用[[:>:]]。
3. 额外的语法隐患:保留关键字作为表名
你的查询里写了into table,但table是PostgreSQL的保留关键字,直接使用会触发语法错误,必须用双引号包裹成into "table"。
修正后的完整查询语句
SELECT * INTO "table" FROM table2 WHERE (Description ~ '[[:<:]]D\s*(&|AND|&AMP;|N|AMP|\*|\+)\s*B.*');
关键修正点说明
- 替换
\b为**[[:<:]]**:确保匹配的是单词开头的D,而不是退格字符 - 保留**
\+**的正确转义:用来匹配字段中实际的加号字符 - 用**
"table"**包裹目标表名:避免保留关键字的语法冲突 - 保留了你原本要匹配的所有分隔符规则:
&、AND、&AMP;、N、AMP、*、+
补充说明
如果你的Description字段里存储的是原始的&字符(而不是HTML转义后的&),可以把正则里的&改成&,&AMP;改成&,修正后的正则会是:
'[[:<:]]D\s*(&|AND|&|N|AMP|\*|\+)\s*B.*'
内容的提问来源于stack exchange,提问作者ZJAY
相关产品推荐
相关产品推荐

