正则表达式需求:匹配非单词组成部分的整数与浮点数
解决Vertica中移除独立数字(保留单词内嵌数字)的正则方案
嘿,我明白你的需求——要在Vertica里用REGEXP_REPLACE剥离那些不属于单词一部分的整数、浮点数,同时像table5、go2market这种和字母绑定的数字要完整保留对吧?刚好对Vertica的Basic Regex(BRE)有点经验,给你梳理下方案:
核心思路
我们要匹配的是前后不与字母直接相连的数字(包括整数、各种形式的浮点数),替换时只去掉数字部分,保留前后的非字母字符(比如空格、标点、符号)。
最终正则表达式
直接上可以用的REGEXP_REPLACE语句:
REGEXP_REPLACE(your_column_name, '\(^\|[^a-zA-Z]\)\(\([0-9]+\.[0-9]*\|\.[0-9]+\|[0-9]+\)\)\(\([^a-zA-Z]\|$\)', '\1\3', 'g')
拆解说明
我把这个正则拆成几部分,方便你理解:
- 匹配前后边界:
\(^\|[^a-zA-Z]\)和\([^a-zA-Z]\|$\)- 前者匹配字符串开头,或者非字母字符(确保数字前面不是字母)
- 后者匹配非字母字符,或者字符串结尾(确保数字后面不是字母)
- 匹配数字序列:
\([0-9]+\.[0-9]*\|\.[0-9]+\|[0-9]+\)[0-9]+\.[0-9]*:匹配带小数点的浮点数(比如3.14、6.)\.[0-9]+:匹配以小数点开头的浮点数(比如.5)[0-9]+:匹配纯整数(比如123)
- 替换逻辑:用
\1\3替换整个匹配项——也就是保留前后的非字母边界,去掉中间的数字部分,'g'标志表示全局替换(处理所有符合条件的数字)
测试验证
举几个常见场景的效果:
- 输入:
"hello 123 world"→ 输出:"hello world" - 输入:
"table5 and go2market"→ 输出:"table5 and go2market"(完全保留) - 输入:
"$45.67 is the price"→ 输出:"$ is the price" - 输入:
"(789) .5 3."→ 输出:"() . ."
注意事项
Vertica用的是POSIX Basic Regex,所以语法上有几个关键点:
- 分组必须用转义括号
\( \),而不是普通括号 - 或操作符要写成
\|,不能直接用| - 全局替换需要显式加
'g'标志,否则只会替换第一个匹配项
内容的提问来源于stack exchange,提问作者Bjorn
相关产品推荐
相关产品推荐

