如何使用正则表达式拆分含多条select语句的SQL文本 去除末尾分号
解决方案
问题原因
你使用的拆分正则@";\s+\n"仅能匹配分号+空白字符+换行的组合,最后一条SQL语句的结尾是分号+文件结束符,没有后续换行,无法触发拆分逻辑,因此分号会被保留在最后一条语句的末尾。
推荐实现方案
方案1:调整拆分正则(改动最小)
修改拆分正则为@";\s*(?:\n|$)",既可以匹配分号后接换行的场景,也可以匹配分号后接文件结束的场景,拆分后过滤空串即可:
var sqlStatements = Regex.Split(sqlS, @";\s*(?:\n|$)") .Where(s => !string.IsNullOrWhiteSpace(s)) .ToList();
方案2:使用正则匹配(更精准,容错性更高)
直接通过正则提取所有符合规则的SELECT语句,天然规避拆分带来的边界问题,不需要额外处理分号:
// 正则开启多行模式,逐行匹配以select开头、分号结尾的语句,直接提取分号前的内容 var matches = Regex.Matches(sqlS, @"^\s*(select.*?)\s*;\s*$", RegexOptions.Multiline | RegexOptions.Singleline); var sqlStatements = matches.Cast<Match>() .Select(m => m.Groups[1].Value) .ToList();
两种方案最终得到的sqlStatements列表中的每一条语句都不会携带末尾分号,符合需求。
内容的提问来源于stack exchange,提问作者Zita Kemeny
相关产品推荐
相关产品推荐

