有没有办法在引号之外拆分逗号,并忽略引号内的双引号?当使用SQL进行操作时,这将非常有用。
我正在尝试拆分SQL语句,而SQL使用单引号来转义字符串中的单引号。
e.g。
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结合使用,但到目前为止无法使其正常工作。
答案 0 :(得分:2)
使用此正则表达式进行拆分:
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'
答案 1 :(得分:1)
只需用另一个char替换双引号(如chr(1)),然后通过你的正则表达式拆分整个字符串,然后通过将(chr(1))替换为double double来重新映射拆分的块引号。
答案 2 :(得分:0)