将文本拆分为选择
Posted
技术标签:
【中文标题】将文本拆分为选择【英文标题】:Split text into selects 【发布时间】:2021-12-07 06:07:39 【问题描述】:从具有下一个内容的文件中读取字符串:
select 1 from dual;
select 2 from dual;
select 3 from dual;
我想使用下一个正则表达式提取每个选择语句:
Regex.Split(sqlS, @";\s+\n")
结果数组包含所有选择,但最后一个在末尾有分号,这是我想要避免的。我希望能够拆分包含许多选择的文本,每个选择都以分号结尾。每个选择都从新行开始。
【问题讨论】:
File.ReadAllLines().Select(x => x.Trim(';'));
怎么样
或者,trimEnd 之前的字符串:Regex.Split( sqlS.TrimEnd(new[] ';'), @";\s*\n" )
.
为什么不用string.Split
和';'
作为分离器?此外,如果您要按原样运行 3 个查询,为什么不在每个查询的末尾加上分号,这不会影响任何事情(IIRC)。
如果选择在某种意义上是您的“数据”,我会将它们放在 XML 或 JSON 中,这样您就可以简单地将它们反序列化为数据结构(可能是数组或列表)。无需处理它们的实际结构。
我不能改变输入字符串的格式可以这么说。但是 xml 和 json 的想法对于下一个版本或重构我编写的应用程序来说是一个很好的想法。谢谢
【参考方案1】:
在与您的正则表达式拆分之前从字符串末尾修剪;
(我认为\s*
会更好,即使行尾不是CRLF):
Regex.Split( sqlS.TrimEnd(new[] ';'), @";\s*\n" )
见C# demo:
var text = @"select 1 from dual;
select 2 from dual;
select 3 from dual;";
var output = Regex.Split( text.TrimEnd(new[] ';'), @";\s*\n" );
foreach (var s in output)
Console.WriteLine(s);
输出:
select 1 from dual
select 2 from dual
select 3 from dual
【讨论】:
感谢维克托。这工作正常。 我在想如果一个 sql 语句很长并且在一个由撇号分隔的字符串中包含分号怎么办。我认为这个解决方案失败了。 @ZitaKemeny 一般来说,如果你想真正解析 SQL 语法,任何正则表达式都会失败。那么你需要一个专用的 SQL 解析器。【参考方案2】:如果所有的 sql 语句都在一个由;
分隔的文件中并带有换行符,那么您可以尝试下面的代码来获取 sql 语句数组,
var filePath = @"C:\Program Files\sqlstatements.txt";
var sqlStatements = File.ReadAllLines(filePath) //Read file and store all lines in an array
.Select(x => x.Trim(';')) //Now iterate over each line and remove semi-colon.
.ToList(); //Optional: Convert String[] to List<string>
【讨论】:
这看起来也不错。谢谢以上是关于将文本拆分为选择的主要内容,如果未能解决你的问题,请参考以下文章
是否可以在 Intellij IDEA 中将选择拆分为多个光标?