在 C# 中使用 Regex.Split
Using Regex.Split in c#
所以我有一个包含雪花列的字符串,我想将字符串拆分为每一列,我正在尝试使用 Regex 来执行此操作,因为拆分字符串在这种情况下不起作用。我试过的字符串模式是
string pattern = @"([^\s]*\s[^\s]*),"
尽管此模式在连续第二次 space 后分裂。我不确定如何在别名之后拆分它。我也在使用.net core 3.1。任何帮助将不胜感激..
当前雪花数据列字符串:
string columns = "nvl(u.\"Country\",'#N/A') \"Country\",u.\"CreatedDate\" \"CreatedDate\",nvl(u.\"Email\",'#N/A') \"Email\",u.\"LastModifiedDate\" \"LastModifiedDate\",nvl(u.\"Name\",'#N/A') \"Name\"";
预期输出:
nvl(u."国家",'#N/A') "国家"
u."CreatedDate" "CreatedDate"
nvl(u."Email",'#N/A') "Email"
u."LastModifiedDate" "LastModifiedDate"
nvl(u."姓名",'#N/A') "姓名"
你可以使用
string[] result = Regex.Split(text, @"(?<=\s""\w+""),");
见.NET regex demo。 详情:
(?<=\s"\w+")
- 匹配前面紧跟空格的位置的正后视,"
,一个或多个字符,"
,
- 一个逗号。
另一个想法是提取与
的匹配
var result = Regex.Matches(text, @"\b(?:nvl\([^()]*\)|u\.""[^""]*"")\s+""[^""]*""")
.Cast<Match>()
.Select(x => x.Value);
详情:
\b
- 单词边界
(?:nvl\([^()]*\)|u\."[^"]*")
- nvl(...)
或 u."..."
\s+
- 一个或多个空格
"[^"]*"
- "
,零个或多个非 "
,以及一个 "
.
您可以使用捕获组(组 1)并在匹配 space 后排除第二部分中的逗号。要匹配所有部分,您可以匹配逗号或模式末尾的字符串结尾。
这部分[^\s]*
可以写成\S*
(\S*\s[^\s,]*)(?:,|$)
(
捕获 组 1
\S*\s[^\s,]*
匹配可选的非白色space 字符,匹配白色space 字符并匹配可选的非白色space 字符,comme 除外
)
关闭组 1
(?:,|$)
匹配逗号或断言字符串结尾
例如
string pattern = @"(\S*\s[^\s,]*)(?:,|$)";
string input = @"nvl(u.""Country"",'#N/A') ""Country"",u.""CreatedDate"" ""CreatedDate"",nvl(u.""Email"",'#N/A') ""Email"",u.""LastModifiedDate"" ""LastModifiedDate"",nvl(u.""Name"",'#N/A') ""Name""";
foreach (Match m in Regex.Matches(input, pattern))
{
Console.WriteLine(m.Groups[1].Value);
}
输出
nvl(u."Country",'#N/A') "Country"
u."CreatedDate" "CreatedDate"
nvl(u."Email",'#N/A') "Email"
u."LastModifiedDate" "LastModifiedDate"
nvl(u."Name",'#N/A') "Name"
使用 +
匹配 1 个或多个字符并匹配双引号之间的单词字符的更具体的模式:
(\S+\s"\w+")(?:,|$)
所以我有一个包含雪花列的字符串,我想将字符串拆分为每一列,我正在尝试使用 Regex 来执行此操作,因为拆分字符串在这种情况下不起作用。我试过的字符串模式是
string pattern = @"([^\s]*\s[^\s]*),"
尽管此模式在连续第二次 space 后分裂。我不确定如何在别名之后拆分它。我也在使用.net core 3.1。任何帮助将不胜感激..
当前雪花数据列字符串:
string columns = "nvl(u.\"Country\",'#N/A') \"Country\",u.\"CreatedDate\" \"CreatedDate\",nvl(u.\"Email\",'#N/A') \"Email\",u.\"LastModifiedDate\" \"LastModifiedDate\",nvl(u.\"Name\",'#N/A') \"Name\"";
预期输出:
nvl(u."国家",'#N/A') "国家"
u."CreatedDate" "CreatedDate"
nvl(u."Email",'#N/A') "Email"
u."LastModifiedDate" "LastModifiedDate"
nvl(u."姓名",'#N/A') "姓名"
你可以使用
string[] result = Regex.Split(text, @"(?<=\s""\w+""),");
见.NET regex demo。 详情:
(?<=\s"\w+")
- 匹配前面紧跟空格的位置的正后视,"
,一个或多个字符,"
,
- 一个逗号。
另一个想法是提取与
的匹配var result = Regex.Matches(text, @"\b(?:nvl\([^()]*\)|u\.""[^""]*"")\s+""[^""]*""")
.Cast<Match>()
.Select(x => x.Value);
详情:
\b
- 单词边界(?:nvl\([^()]*\)|u\."[^"]*")
-nvl(...)
或u."..."
\s+
- 一个或多个空格"[^"]*"
-"
,零个或多个非"
,以及一个"
.
您可以使用捕获组(组 1)并在匹配 space 后排除第二部分中的逗号。要匹配所有部分,您可以匹配逗号或模式末尾的字符串结尾。
这部分[^\s]*
可以写成\S*
(\S*\s[^\s,]*)(?:,|$)
(
捕获 组 1\S*\s[^\s,]*
匹配可选的非白色space 字符,匹配白色space 字符并匹配可选的非白色space 字符,comme 除外
)
关闭组 1(?:,|$)
匹配逗号或断言字符串结尾
例如
string pattern = @"(\S*\s[^\s,]*)(?:,|$)";
string input = @"nvl(u.""Country"",'#N/A') ""Country"",u.""CreatedDate"" ""CreatedDate"",nvl(u.""Email"",'#N/A') ""Email"",u.""LastModifiedDate"" ""LastModifiedDate"",nvl(u.""Name"",'#N/A') ""Name""";
foreach (Match m in Regex.Matches(input, pattern))
{
Console.WriteLine(m.Groups[1].Value);
}
输出
nvl(u."Country",'#N/A') "Country"
u."CreatedDate" "CreatedDate"
nvl(u."Email",'#N/A') "Email"
u."LastModifiedDate" "LastModifiedDate"
nvl(u."Name",'#N/A') "Name"
使用 +
匹配 1 个或多个字符并匹配双引号之间的单词字符的更具体的模式:
(\S+\s"\w+")(?:,|$)