Java 删除单行注释,但不删除由单引号括起的字符串

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

我正在创建一个示例代码,它解析一个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 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")