Spark DataFrame仅移除负值前导零的正确实现方法咨询
解决Spark DataFrame中仅移除负值前导零的问题
我明白你的需求:只对以多个前导零开头且后面紧跟负号的字符串移除这些前导零,其他格式的字符串保持原样,同时不能丢失负号。你的初始正则表达式问题在于把负号也一起替换掉了,我们来修正这个问题。
正确的正则表达式方案
核心思路是:仅匹配开头的连续零,且这些零后面直接跟着负号的部分,只移除这些零,保留负号。可以使用带正向预查的正则表达式:
^0+(?=-)
这个正则的含义:
^:匹配字符串开头0+:匹配一个或多个连续的零(?=-):正向预查,确保这些零的后面紧跟一个负号(但负号本身不会被包含在匹配内容里)
这样替换的时候,只会把开头的那些零去掉,负号会被保留下来。
Spark SQL 实现示例
我们用这个正则重新测试你的所有案例:
spark.sql(""" select regexp_replace("0000-12.45", "^0+(?=-)", "") as d, regexp_replace("000012.45", "^0+(?=-)", "") as d1, regexp_replace("000$.00", "^0+(?=-)", "") as d2, regexp_replace("0$", "^0+(?=-)", "") as d3, regexp_replace("0.", "^0+(?=-)", "") as d4, regexp_replace("51.46", "^0+(?=-)", "") as d5, regexp_replace("-123.67", "^0+(?=-)", "") as d6, regexp_replace("00012.45", "^0+(?=-)", "") as d7, regexp_replace("012.45", "^0+(?=-)", "") as d8 """).show()
执行结果
+-------+---------+--------+---+---+-----+---------+---------+--------+ | d| d1| d2| d3| d4| d5| d6| d7| d8| +-------+---------+--------+---+---+-----+---------+---------+--------+ |-12.45|000012.45|000$.00| 0$|0.|51.46|-123.67|00012.45|012.45| +-------+---------+--------+---+---+-----+---------+---------+--------+
这个结果完全符合你的预期:
- 负值前导零被移除且负号保留
- 其他所有格式的字符串(正数前导零、带特殊符号的字符串、纯零相关格式等)都保持原样
为什么初始方案失败?
你原来的正则^0+-(?!$)会匹配开头的连续零加上负号这个整体,替换为空后自然就丢失了负号。而我们的新正则通过正向预查,只匹配需要移除的前导零,不会触碰负号,完美解决了问题。
内容的提问来源于stack exchange,提问作者nandini
相关产品推荐
相关产品推荐

