从字符串中提取子字符串
Posted
技术标签:
【中文标题】从字符串中提取子字符串【英文标题】:Extract sub Strings From a String 【发布时间】:2016-06-14 07:11:07 【问题描述】:我有一个从文件中读取的数据库脚本,并将该脚本放入字符串变量中。该文件包含多个要执行的 DB 脚本。现在我想把那个大字符串分解成子字符串,因为我的字符串找到了 GO 关键字。
我正在使用
myString.split("Go");
--注意:“Go”关键字在执行脚本时不区分大小写,它可以是“go”、“Go”、“GO”或任何东西
但这对我不起作用,因为有些表或数据库名称包含 GO 并且脚本也在那里拆分。
这是我的脚本:
---- Database New_Db_Gomsle
IF NOT EXISTS (SELECT * FROM user_table_gomsle WHERE USER id = 1124)
BEGIN
ALTER TABLE user_table_gomsle
ADD user_img varchar(MAX)
END
Go
--- Database Angolifie_Db
IF NOT EXISTS (SELECT * FROM user_table_Angolifie WHERE USER id = 1124)
BEGIN
ALTER TABLE user_table_gomsle
ADD user_img varchar(MAX)
END
GO
ALTER TABLE gotham_Accessories
ALTER COLUMN stationary_count INT
go
Like there 在脚本注释、表名、数据库名中退出 'Go' 关键字。
我期待这样的结果
string[] myQueryArray = new string[10];
myQueryArray[0] = "---- Database New_Db_Gomsle
IF NOT EXISTS (SELECT * FROM user_table_gomsle WHERE USER id = 1124)
BEGIN
ALTER TABLE user_table_gomsle
ADD user_img varchar(MAX)
END
Go"
myQueryArray[1] = " --- Database Angolifie_Db
IF NOT EXISTS (SELECT * FROM user_table_Angolifie WHERE USER id = 1124)
BEGIN
ALTER TABLE user_table_gomsle
ADD user_img varchar(MAX)
END
GO"
myQueryArray[2] = "ALTER TABLE gotham_Accessories
ALTER COLUMN stationary_count INT
go"
但由于数据库名称、表名、注释中的“Go”关键字,我没有得到这样的结果。
【问题讨论】:
你应该看看正则表达式。在某种程度上,这是 string.split 的成人版本。 试着把myString.ToUpper().split("GO");
Executing SQL batch containing GO statements in C#的可能重复
【参考方案1】:
var options = RegexOptions.Multiline | RegexOptions.IgnoreCase;
string[] myQueryArray = Regex.Split(myString, @"^\s*GO\s*$", options);
但是即使这样的解决方案也可能是不正确的,在那种情况下,如果sql写成如下:
select
ID,
GO
from tableName;
其中GO
- 单行上的列名。
因此,唯一完全有效的解决方案是 sql 解析器。
【讨论】:
您的正则表达式工作正常,但它对“GO”区分大小写,如果脚本以“Go”或“go”结尾怎么办。 嗨,@Alexander,谢谢你的工作,我只是更新了正则表达式,例如: Regex.Split(sqlQuery, @"^\s*GO|Go|go|gO\s*$", RegexOptions .Multiline); @MustafaGaziani - 查看更新。使用RegexOptions.IgnoreCase
。【参考方案2】:
每个脚本后面都有一个新行,这在字符串中由 \n 或 \r 表示。
您可以尝试使用“GO\r”、“GO\n”或“GO\r\n”来拆分字符串
【讨论】:
【参考方案3】:你可以试试这个:
string test = "select * from table1 GO select * from table2";
string[] myQueryArray = Regex.Split(test, "GO");
希望这会对您有所帮助。谢谢。
【讨论】:
如果找到关键字 GO 以及在其他地方随机找到 GO 时(例如名为 TableGOFoo 的表),这仍然会触发 在上述问题中,Mustafa 尝试使用 Go 进行拆分,这表明没有您提到的情况,但是为什么要浪费时间在某天可能会出现的情况上?显然你所说的完全可以理解。 如果 cmets 或 db_name 或表名中有 GO 则不起作用 @Mustafa:那你为什么要用 Go 分裂? 这就是我提到的问题,它不起作用,@Alexander Petrov 提供的正则表达式在我的情况下工作正常。以上是关于从字符串中提取子字符串的主要内容,如果未能解决你的问题,请参考以下文章