从字符串中提取子字符串

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 提供的正则表达式在我的情况下工作正常。

以上是关于从字符串中提取子字符串的主要内容,如果未能解决你的问题,请参考以下文章

使用 Python 的字符串子序列内核和 SVM

如何更改python字符串子字符串信息

[在python中使用正则表达式搜索字符串子字符串

求字符串不同子串个数

数组篇在python中如何查找最长字符串子串

子串子序列问题