C# 正则表达式查找

C# 正则表达式查找,c#,.net,regex,C#,.net,Regex,我不认为仅仅用正则表达式就可以做到这一点,但我不是专家,所以我认为值得一问 我正在尝试使用.NET正则表达式对C代码进行大规模搜索和替换。我想做的是找到一行代码,其中对DateTime类型的变量调用特定函数。e、 g: axRecord.set_Field("CreatedDate", m_createdDate); 我知道这是一个日期时间变量b/c,在前面的代码文件中是这样的: DateTime m_createdDate; 但我似乎不能在负回溯中使用命名组,如: (?<=DateT

我不认为仅仅用正则表达式就可以做到这一点,但我不是专家,所以我认为值得一问

我正在尝试使用.NET正则表达式对C代码进行大规模搜索和替换。我想做的是找到一行代码,其中对DateTime类型的变量调用特定函数。e、 g:

axRecord.set_Field("CreatedDate", m_createdDate);
我知道这是一个日期时间变量b/c,在前面的代码文件中是这样的:

DateTime m_createdDate;
但我似乎不能在负回溯中使用命名组,如:

(?<=DateTime \k<1>.+?)axRecord.set_[^ ]+ (?<1>[^ )]+)
第一个匹配包含第二个变量声明


有没有一种好的方法可以只用正则表达式来实现这一点,或者我必须在我的逻辑中使用脚本吗?

使用单个正则表达式很难做到这一点。但是,如果考虑处理具有一点状态的行,则可以这样做。p> 注意:我无法准确地告诉您在axRecord行上要匹配什么,因此您可能需要适当地调整该正则表达式

void Process(List<string> lines) {
  var comp = StringComparer.Ordinal;
  var map = new Hashset<string>comp);
  var declRegex = new Regex("^\s(?<type>\w+)\s*(?<name>m_\w+)\s*";);
  var toReplaceRegex = new Regex("^\s*axRecord.set_(?<toReplace>.*(?<name>m_\w+).*)");

  for( var i = 0; i < lines.Length; i++) {
    var line = lines[i];
    var match = declRegex.Match(line);
    if ( match.Success ) {
      if ( comp.Equals(match.Groups["type"], "DateTime") ) {
        map.Add(comp.Groups["name"]);
      } else {
        map.Remove(comp.Groups["name"]);
      }
      continue;
    }

    match = toReplaceRegex.Match(line);
    if ( match.Success && map.Contains(match.Groups["name"]) ) {
      // Add your replace logic here
    }
}
作废流程(列表行){
var comp=序列字符串比较器;
var map=新的Hashsetcomp);
var declRegex=newregex(“^\s(?\w+)\s*(?m\w+\s*”);
var torereplaceregex=newregex(“^\s*axRecord.set_(?.*(*m\uw+)”);
对于(变量i=0;i > > p>这将很难用一个正则表达式来表达。但是,如果你考虑处理一个有状态的行,就可以这样做。
注意:我无法准确地告诉您在axRecord行上要匹配什么,因此您可能需要适当地调整该正则表达式

void Process(List<string> lines) {
  var comp = StringComparer.Ordinal;
  var map = new Hashset<string>comp);
  var declRegex = new Regex("^\s(?<type>\w+)\s*(?<name>m_\w+)\s*";);
  var toReplaceRegex = new Regex("^\s*axRecord.set_(?<toReplace>.*(?<name>m_\w+).*)");

  for( var i = 0; i < lines.Length; i++) {
    var line = lines[i];
    var match = declRegex.Match(line);
    if ( match.Success ) {
      if ( comp.Equals(match.Groups["type"], "DateTime") ) {
        map.Add(comp.Groups["name"]);
      } else {
        map.Remove(comp.Groups["name"]);
      }
      continue;
    }

    match = toReplaceRegex.Match(line);
    if ( match.Success && map.Contains(match.Groups["name"]) ) {
      // Add your replace logic here
    }
}
作废流程(列表行){
var comp=序列字符串比较器;
var map=新的Hashsetcomp);
var declRegex=newregex(“^\s(?\w+)\s*(?m\w+\s*”);
var torereplaceregex=newregex(“^\s*axRecord.set_(?.*(*m\uw+)”);
对于(变量i=0;i
使用正则表达式无法做到这一点。首先,C#的语法不是正则的;但更重要的是,你要分析的是词汇上不相关的表达式。对于这类事情,你需要进行完整的语义分析。这意味着词法分析器、语法分析器、名称绑定以及最后的类型检查器。一旦你没有他注释了AST,您可以查找所需的字段,然后读取类型


我猜这要比你想做的工作多得多,因为它大约是一个成熟的C#编译器的一半。

这不能用正则表达式来完成。一方面,C#的语法不是正则的;但更重要的是,你说的是分析词汇上不相关的表达式。对于这类事情,你是going需要完整的语义分析。这意味着词法分析器、语法分析器、名称绑定以及最后的类型检查。一旦你有了带注释的AST,你就可以查找你想要的字段并读取类型


我猜这要比你想做的工作多得多,因为它大约是一个成熟的C#编译器的一半。

看看我对这个问题的回答

它提供指向页面的链接,这些页面显示如何使用内置的.net语言解析器简单可靠地执行此操作(即,不是通过询问“我正在搜索的用法是什么”,而是通过VS代码解析工具正确解析代码)


我知道这不是正则表达式的答案,但我认为正则表达式不是答案。

看看我对这个问题的答案

它提供指向页面的链接,这些页面显示如何使用内置的.net语言解析器简单可靠地执行此操作(即,不是通过询问“我正在搜索的用法是什么”,而是通过VS代码解析工具正确解析代码)


我知道这不是正则表达式的答案,但我认为正则表达式不是答案。

这很奇怪。我设法构建了一个正则表达式,找到了它,但它只匹配第一个

(?<=private datetime (?<1>\b\w+\b).+?)set_field[^;]+?\k<1>

(?这很奇怪。我成功地构建了一个正则表达式来找到它,但它只匹配第一个正则表达式

(?<=private datetime (?<1>\b\w+\b).+?)set_field[^;]+?\k<1>
(?试试这个:

@"(?s)set_Field\(""[^""]*"",\s*(?<vname>\w+)(?<=\bDateTime\s+\k<vname>\b.+)"
@(?s)设置字段\(“”[^”“]*“”,\s*(?\w+)(请尝试以下操作:

@"(?s)set_Field\(""[^""]*"",\s*(?<vname>\w+)(?<=\bDateTime\s+\k<vname>\b.+)"

@(?s)设置字段\(“”[^”“]*“”,\s*(?\w+)(?看我的答案,你可以借助VS,在EnvDTE对象中免费获得所有这些。看我的答案,你可以借助VS,在EnvDTE对象中免费获得所有这些。这是一个很好的解决方案,但在第二天左右,除非Jan Goyvaerts进来说这不可能,否则我将假设它是:)@ LoviMeMeCODE,这是一个边界不可能的问题。考虑一下,如果你希望它在任何C/C代码中工作100%的时间,用正则表达式是不可能的。ReGEX不像解析器那么强大。另一方面,如果你想在你的特定项目中找到一个代码的解决方案,那么这是一个很好的解决方案,但是在第二天左右,UNL。女秘书长简·戈瓦茨(Jan Goyvaerts)进来说这是不可能的,我假设是:)@ LoviMeMeCODE,这是一个边界不可能的问题。考虑一下,如果你希望它在任何C/C代码中工作100%的时间,正则表达式是不可能的。ReGEX不像解析器那么强大。另一方面,如果你想在特定的项目中找到代码的解决方案,实际上可能是这种模式。