【问题标题】:C# getting variables from a CAST statement using RegexC# 使用正则表达式从 CAST 语句中获取变量
【发布时间】:2016-11-06 03:39:28
【问题描述】:

我有以下输入字符串:

String text = "Cast(@myvar AS datetime)";

有什么方法可以提取使用正则表达式的变量和数据类型吗?

预期输出:

name ='@myvar'
type ='datetime'

【问题讨论】:

  • 什么是“CAST”?你的问题似乎太具体了;仅举一个例子,不清楚什么可以变化,因此也不清楚提取您想要的部分需要什么。 [例如,您可以简单地以固定偏移量获取 text 的子字符串,但这通常可能不起作用]
  • 实际上我的最终目标是在一个 SQL 文件中找到所有 Cast 语句并将它们替换为 Convert 语句。例如。 Cast(@myvar AS datetime) 被转换为 Convert(datetime,@myvar)。知道如何在 C# 中做到这一点
  • 你的意思是这个 cast/convert 的定义:msdn.microsoft.com/en-us/library/ms187928.aspx 如果你忽略风格,它们看起来是等价的,那么你为什么需要改变任何东西呢?
  • 是的,但我需要将其作为业务需求来实施以符合标准。所以我需要创建一个实用程序,以编程方式将 Cast 语句替换为等效的 convert 语句
  • 如果只有几百个,您只需手动操作,每个操作 1-2 分钟即可节省时间。还有更多吗?

标签: c# regex pattern-matching


【解决方案1】:

您可以使用以下表达式并使用捕获组来获取对:

(?<=cast\()(.*)(?:\s+as\s+)(.*)(?=\))

See at Regex101

var text = "Cast(@myvar1 AS datetime2)" + Environment.NewLine + "Cast(@myvar2 AS datetime2)";

var matches = new Regex(@"(?<=cast\()(.*?)(?:\s+as\s+)(.*?)(?=\))", RegexOptions.IgnoreCase).Matches(text);

foreach(Match match in matches)
{
    // first capturing group will be full match, so we need to start with index 1 for actual group 1
    var name = match.Groups[1];
    var type = match.Groups[2];

    Console.WriteLine("Name: {0}, Type: {1}", name, type);
}

// Name: @myvar1, Type: datetime2
// Name: @myvar2, Type: datetime2

【讨论】:

  • 很高兴我能帮上忙
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多