Java 删除单行注释,但不删除由单引号括起的字符串
我正在创建一个示例代码,它解析一个SQL文件,其中包含SQL和注释代码块,如:Java 删除单行注释,但不删除由单引号括起的字符串,java,regex,string,parsing,Java,Regex,String,Parsing,我正在创建一个示例代码,它解析一个SQL文件,其中包含SQL和注释代码块,如: -- CREATE PROCEDURE /* Cleaned By : Tej Kiran Cleaned On : 05/12/2009 -- Procedure [ChambalSchedules] */ CREATE procedure [dbo].[ChambalSchedules] ( @dyid INT = -1, @dy VARCHAR(10) = '', @yr VARCH
-- CREATE PROCEDURE
/*
Cleaned By : Tej Kiran
Cleaned On : 05/12/2009
-- Procedure [ChambalSchedules]
*/
CREATE procedure [dbo].[ChambalSchedules]
(
@dyid INT = -1,
@dy VARCHAR(10) = '',
@yr VARCHAR(10) = '',
@dt DATETIME = '',
@HID INT = 0,
@HsID INT = 0,
@CID INT = 0,
@ScId INT = 0
)
AS
BEGIN
DECLARE @BLID BIT
DECLARE @BsID BIT
DECLARE @BTID BIT
DECLARE @BShId BIT
SET @BLID = 0
SET @BsID = 0
SET @BTID = 0
SET @BShId = 0
...
...
...
SELECT
ShID
, ShType
, ISNULL(list,'---') AS List
, Dy
, ChambalID
, CTypeID
FROM #testing1
WHERE
Day = @dyid
ORDER BY
Day
,ShID
... .
...
END;
我使用Java来解析这样的查询。我想清除以-开头、以\n结尾的单行注释,但不想删除引号之间的内容:“text-text”
我使用了以下正则表达式:
qry= qry.replaceAll("(\s--.*)|((m?)^--.*\n)","");
它在中运行良好,但在我的Java代码中,它也在删除“---”
请推荐正确的正则表达式
我有以下情况:
案例1:行以-开头,之后可能有任何字符或介于-和\n新行字符之间的特殊字符
-这是我的评论行,应该删除
案例2:行开始其他代码,并且在行尾有一条注释
从表中选择*;-GetListFrom表\n
注意:我想从表中删除-GetList\n
案例3:如果行包含-在单引号之间,则不执行任何操作
从testing1中选择ShID、ShType、ISNULLlist、“--”作为list、Dy、chambalID、CTypeID,其中Dy=@dyid ORDER BY Day,ShID
在这种情况下,不应删除任何内容。
请给出正确的方法。使用纯正则表达式解析如此复杂的内容时,最大的问题之一是效率。所以我放弃了这个想法,转而采用混合解决方案 我想你的大部分台词都不会有-任何地方。可以使用扫描仪获取每一行,并且很容易查看是否有-礼物: 速度很快,可读性也很强。接下来,我们可以使用正则表达式:
line.replace("^((?:(?:'[^']*')|[^'-])*)--.*", "$1")
现在,当正则表达式匹配时,它将捕获整个行。这就是为什么有必要更换1美元。以下部分费用为1美元:
“[^']*”匹配引号之间的任何内容
[^'-]匹配的字符不是-或'
正则表达式的其余部分捕获-行中的其余字符请记住,正则表达式一次只应用于一行
这个方法没有考虑到一些事情。但它比其他方法更稳健,因此不太可能出现这些边缘情况:
它只适用于跨一行的字符串。
它无法识别字符串中的转义字符。
它不喜欢在引号外看到一个破折号。
如果您觉得上述任何问题与您的问题相关,或者遇到其他问题,请随时告诉我,我会考虑更新此答案。请尝试以下模式\n | ^ \s*-.[^']$\n。它还包括注释符号前的选项空格。如果不需要,请删除该部分,但在这种情况下,您必须根据注释行第一行、中间行或最后一行的位置来替换该字符串。上面的正则表达式只允许删除从行开始的注释。正确的方法是不使用正则表达式。而是进行完整的SQL词法分析。例如,考虑一下“字符串”-“评论的一部分”,亨利同意。为了处理本主题中提到的所有情况,应该分析整个查询。在JDBC中使用-sql注释行时,它会注释掉整个查询!这真是一团糟!。我以前遇到过这个问题,尽管听起来很痛苦,但我不得不手动编辑查询。如果你确实需要保留评论,我建议你使用/**/comment
Scanner getLine = new Scanner(qry);
while(getLine.hasNextLine()){
String line = getLine.nextLine();
if(line.contains("--")){
// replacement happens here
}
}
line.replace("^((?:(?:'[^']*')|[^'-])*)--.*", "$1")