我有一个场景,当句点被字母包围时,我想替换它,而不是被数字包围时。我发现了一个正则表达式模式,它只能识别密钥名称中的句点,但该模式在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风格。