繁体   English   中英

在 c# 中使用 Regex.Split

[英]Using Regex.Split in c#

所以我有一个包含雪花列的字符串,我想将字符串拆分为每一列,我正在尝试使用 Regex 来执行此操作,因为拆分字符串在这种情况下不起作用。 我试过的字符串模式是

string pattern = @"([^\s]*\s[^\s]*),"

尽管此模式在第二个连续空格后分裂。 我不确定如何在别名之后拆分它。 我也在使用 .net 核心 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\"";

预计 output:
nvl(u."国家",'#N/A') "国家"
u."创建日期" "创建日期"
nvl(u."电子邮件",'#N/A') "电子邮件"
u."LastModifiedDate" "LastModifiedDate"
nvl(u."姓名",'#N/A') "姓名"

您可以使用

string[] result = Regex.Split(text, @"(?<=\s""\w+""),");

请参阅.NET 正则表达式演示 详情

  • (?<=\s"\w+") - 正向后视匹配紧跟在空格前面的位置, " ,一个或多个单词字符, "
  • , - 逗号。

在此处输入图像描述

另一个想法是提取匹配项

var result = Regex.Matches(text, @"\b(?:nvl\([^()]*\)|u\.""[^""]*"")\s+""[^""]*""")
    .Cast<Match>()
    .Select(x => x.Value);

请参阅此正则表达式演示

在此处输入图像描述

详情

  • \b - 单词边界
  • (?:nvl\([^()]*\)|u\."[^"]*") - nvl(...)u."..."
  • \s+ - 一个或多个空格
  • "[^"]*" - " ,零个或多个非" s,和一个"

您可以使用捕获组(第 1 组)并在匹配空格后排除第二部分中的逗号。 要匹配所有部分,您可以匹配模式末尾的逗号或字符串末尾。

这部分[^\s]*可以写成\S*

(\S*\s[^\s,]*)(?:,|$)
  • (捕获组 1
    • \S*\s[^\s,]*匹配可选的非空白字符,匹配空白字符并匹配可选的非空白字符,comme 除外
  • )关闭组 1
  • (?:,|$)匹配逗号或断言字符串结尾

.NET 正则表达式演示

在此处输入图像描述

例如

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);
}

Output

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+")(?:,|$)

正则表达式演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM