存在转义引号时,在引号外部用逗号分隔

时间:2015-09-04 16:44:27

标签: java string

有没有办法在引号之外拆分逗号,并忽略引号内的双引号?当使用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结合使用,但到目前为止无法使其正常工作。

3 个答案:

答案 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)

你应该尝试这种模式:

, ([A-Z.]{12})

请参阅以下链接以获取更多信息 https://regex101.com/r/dB9xH2/1

ps:别忘了使用\ 1代替找到的firt模式。