gpt4 book ai didi

java - 当存在转义引号时,在引号外的逗号上拆分

转载 作者:行者123 更新时间:2023-12-02 21:15:34 29 4
gpt4 key购买 nike

有没有办法在引号外分割逗号,并忽略引号内的双单引号?这在使用 SQL 进行操作时非常有用。

我正在尝试拆分 SQL 语句,SQL 使用单引号来转义字符串中的单引号。

例如

String source = "ADDRESS.CITY || ', UK''s', ADDRESS.CITY || ', US''s', ADDRESS.CITY || ', UK''s'";

String[] expected = new String[]{
"ADDRESS.CITY || ', UK''s'",
"ADDRESS.CITY || ', US''s'",
"ADDRESS.CITY || ', UK''s'"
};

String[] result = splitElements(source);
assert expected.equals(result);

我已经尝试过Splitting on comma outside quotes并将其更改为单引号,即

source.split(",(?=(?:[^\']*\'[^\']*\')*[^\']*$)")

问题是它不会忽略双单引号。

我也尝试将它与 Split with single colon but not double colon using regex 结合起来,但到目前为止还无法让它工作。

最佳答案

使用此正则表达式进行分割:

String[] parts = source.split(", *(?=((([^']|'')*'){2})*([^']|'')*$)");

此正则表达式使用前瞻断言当前位置后面的引号数量为偶数,这在逻辑上意味着未包含逗号。

这里的“关键”是使用交替将“非引号”定义为 [^'] '',这意味着双引号被当作单个字符来使用/处理。

注意:

您的测试用例中缺少最终引用,我已在下面的测试代码中修复了该引用。如果未添加引号,则您的测试用例在语法上是无效的 SQL,并且此代码依赖于平衡引号。

<小时/>

一些测试代码:

String source = "ADDRESS.CITY || ', UK''s', ADDRESS.CITY || ', US''s', ADDRESS.CITY || ', UK''s'";
String[] parts = source.split(", *(?=((([^']|'')*'){2})*([^']|'')*$)");
Arrays.stream(parts).forEach(System.out::println);

输出:

ADDRESS.CITY || ', UK''s'
ADDRESS.CITY || ', US''s'
ADDRESS.CITY || ', UK''s'

关于java - 当存在转义引号时,在引号外的逗号上拆分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32402929/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com