【发布时间】:2011-11-17 19:32:36
【问题描述】:
我有一个 Java 字符串,它实际上是一个 SQL 脚本。
CREATE OR REPLACE PROCEDURE Proc
AS
b NUMBER:=3;
c VARCHAR2(2000);
begin
c := 'BEGIN ' || ' :1 := :1 + :2; ' || 'END;';
end Proc;
我想用分号分割脚本,除了出现在字符串中的那些。 所需的输出是四个不同的字符串,如下所述
1- CREATE OR REPLACE PROCEDURE Proc AS b NUMBER:=3
2- c VARCHAR2(2000)
3- begin c := 'BEGIN ' || ' :1 := :1 + :2; ' || 'END;';
4- end Proc
Java Split() 方法也会将上面的字符串拆分为标记。我想保留这个字符串,因为分号在引号内。
c := 'BEGIN ' || ' :1 := :1 + :2; ' || 'END;';
Java Split() 方法输出
1- c := 'BEGIN ' || ' :1 := :1 + :2
2- ' || 'END
3- '
请建议一个正则表达式,它可以用分号分割字符串,除了那些在字符串中的。
====================== CASE-2 ==================== ====
以上部分已得到解答,其工作原理
这是另一个更复杂的案例
============================================== ==========
我有一个 SQL 脚本,我想标记每个 SQL 查询。每个 SQL 查询由分号 (;) 或正斜杠 (/) 分隔。
1- 如果分号或 / 出现在类似的字符串中,我想转义它们
...WHERE col1 = 'some ; name/' ..
2- 表达式还必须转义任何多行注释语法,即 /*
这是输入
/*Query 1*/
SELECT
*
FROM tab t
WHERE (t.col1 in (1, 3)
and t.col2 IN (1,5,8,9,10,11,20,21,
22,23,24,/*Reaffirmed*/
25,26,27,28,29,30,
35,/*carnival*/
75,76,77,78,79,
80,81,82, /*Damark accounts*/
84,85,87,88,90))
;
/*Query 2*/
select * from table
/
/*Query 3*/
select col form tab2
;
/*Query 4*/
select col2 from tab3 /*this is a multi line comment*/
/
想要的结果
[1]: /*Query 1*/
SELECT
*
FROM tab t
WHERE (t.col1 in (1, 3)
and t.col2 IN (1,5,8,9,10,11,20,21,
22,23,24,/*Reaffirmed*/
25,26,27,28,29,30,
35,/*carnival*/
75,76,77,78,79,
80,81,82, /*Damark accounts*/
84,85,87,88,90))
[2]:/*Query 2*/
select * from table
[3]: /*Query 3*/
select col form tab2
[4]:/*Query 4*/
select col2 from tab3 /*this is a multi line comment*/
其中一半已经可以通过上一篇文章中向我提出的建议来实现(link a start)但是当 cmets 语法(/*)被引入到查询中并且每个查询也可以用正斜杠分隔时(/ ),表达式不起作用。
【问题讨论】:
-
转义出现在字符串文字中的引号的规则是什么?
-
从文件中读取整个脚本并存储在字符串中。
-
有趣的是,有一个相关的问题(#2)实际上和你的几乎一模一样……见:stackoverflow.com/questions/328387/…
-
有人能看看这个场景吗?和 / 如果它们出现在字符串或单个或块注释(/* 或 --)中,则转义它们。示例:
codesel * from tab;sfasdf
标签: java regex string stringtokenizer