如何使用singlestore(MemSQL)DB REGEXP_replace函数替换字符串中而非数值中的句点



我有一个场景,当句点被字母包围时,我想替换它,而不是被数字包围时。我发现了一个正则表达式模式,它只能识别密钥名称中的句点,但该模式在SQL 中不起作用

SELECT REGEXP_REPLACE("Amount.fee:0.75,Amount.tot:645.55","(?<!d)(.)(?!d)","_","ig");

预期输出:Amount_fee:0.75,Amount_tot:645.55

注意,我尝试这样做是因为,在MemSQL中,当JSON密钥中有句点时,我无法访问它。

还验证了图案";(?<!\d((.((?!/d("使用https://coding.tools/regex-replace而且运行良好。但是,SQL不起作用。我使用MemSQL 7.1.9和POSIX增强的正则表达式应该是可以工作的。非常感谢您的帮助。

由于您似乎正在尝试解决访问带句点的JSON密钥的问题,我将向您展示如何做到这一点。

这可以通过使用简写json提取语法的同时使用backtics包围json密钥名称来实现:

select col::%`Amount.fee` from (select '{"Amount.fee":0.75,"Amount.tot":645.55}' col);
+--------------------+
| col::%`Amount.fee` |
+--------------------+
|               0.75 |
+--------------------+

或者直接使用json_extract_内置:

select json_extract_double('{"Amount.fee":0.75,"Amount.tot":645.55}', 'Amount.fee');
+------------------------------------------------------------------------------+
| json_extract_double('{"Amount.fee":0.75,"Amount.tot":645.55}', 'Amount.fee') |
+------------------------------------------------------------------------------+
|                                                                         0.75 |
+------------------------------------------------------------------------------+

假设您只想瞄准两个非数字字符之间的点,其中点是而不是字符串中的第一个或最后一个字符,则可以在([^d]).([^d])上匹配并替换为1_2:

SELECT REGEXP_REPLACE("Amount.fee:0.75,Amount.tot:645.55", "([^d]).([^d])", "1_2", "ig");

下面是一个regex演示,显示替换正在工作。请注意,您可能必须使用$1_$2而不是1_2作为替换,这取决于SQL工具的regex风格。

最新更新