匹配正则表达式后复制所有内容
Copy Every thing after a regex is matched
我必须创建一个函数GetSourceCodeOfClass("ClassName",FilePath)
这个函数将被使用超过 10000 次来从 c# 文件中获取 Srouce 代码,并且我必须从每个源文件中提取完整的源代码 class 即
" Class someName { every thing in the body including sinature} "
现在这很简单,如果一个文件包含一个class,但是会有很多源文件包含两个以上的class,而且更大的问题是在单个 class 中可能嵌套了 classes。
我想要以下东西:-
- 我想提取给定 Class
的完整源代码
- 如果文件包含两个以上的 classes 那么我只想提取指定 class.
的源代码
- 如果文件包含多个 class 并且我指定的 class 中嵌套了 classes 那么我想捕获我的 Classes 的来源以及所有嵌套 classes.
我中间有一个算法是:
1-打开文件
2 匹配正则表达式(C# classes 签名)- 参数化
@"(public|private|internal|protected|inline)?[\t ]*(static)?[\t
]class[\t ]" + sOurClassName + @"(([\t ][:][\t ]([a-zA-z]+(([
])[,]([ ])\w+))+))?\s[\n\r\t\s]?{"
3-如果Regex在源文件中匹配
4 从那时开始复制,直到再次匹配相同的正则表达式但没有参数
正则表达式是:
@" (public|private|internal|protected)?[\t ]*(static)?[\t ]class[\t
]\w+(([\t ][:][\t ]([a-zA-z]+(([ ])[,]([
])\w+))+))?\s[\n\r\t\s]?{"
(这是我不知道的地方,我被卡住了。我想复制第一次匹配到第二次匹配后或第一次匹配后直到结束的所有内容)
复制嵌套的 classes 仍然是一个问题,我仍在考虑它,如果有人有想法,也可以帮助我。
注意- match.groups[0] 或 match.groups[1] 这只会复制签名,但我想要 class 的完整来源,这就是我这样做的原因. ..
顺便说一句,我正在使用 C#
我同意 Nathan 的观点,即您最好使用现有的支持 C# 的解析器。尝试为该任务编写正则表达式需要大量工作,而且您不太可能在第一次尝试时就做对。它可能适用于您的第一个示例代码,甚至是前几个示例代码,但最终您会发现一些代码与您的预期略有不同,并且正则表达式将无法捕捉到重要的东西。
就是说,如果您对这种限制和风险感到满意,那么您所询问的一般技术(如果我理解正确的话……这个问题并不完全清楚)就足够普遍了,如果您希望经常使用正则表达式。需要理解的重点是,对于一个Match
对象,可以在next中调用NextMatch()
方法获取下一个匹配项,调用Regex.Match()
方法时,可以通过您要检查的子字符串的开始和长度,它会将其处理限制为该子字符串。
您可以使用后一点从一个正则表达式切换到另一个中间解析。
在您的场景中,我的理解是您想要 运行 包含特定 class 名称的正则表达式,以在文件中找到特定的 class,然后在初始匹配后的文本中搜索文件中的任何后续 class。如果第二次搜索找到某些内容,您只想 return 从第一个匹配开始到第二个匹配开始的文本。如果第二次搜索没有找到任何内容,您希望 return 从第一个匹配项的开头到整个文件结尾的文本。
如果那是正确的,那么像这样的东西应该可以工作:
string ExtractClass(string fileContents, Regex classRegex, Regex nonClassRegex)
{
Match match1 = classRegex.Match(fileContents);
if (!match1.Success)
{
return null;
}
Match match2 = nonClassRegex.Match(fileContents, match1.Index + match1.Length);
if (!match2.Success)
{
return fileContents.Substring(match1.Index);
}
return fileContents.Substring(match1.Index, match2.Index - match1.Index);
}
我应该注意,在两个 class 声明之间,或者在一个单独的 class 声明的结尾和文件的实际结尾之间,很容易有其他非白色-space 不属于 class 声明的文本。我假设你有一个处理这个问题的计划。
如果以上内容未能满足您的需求,您应该仔细检查您的问题,并对其进行编辑以确保长度和清晰度。
我必须创建一个函数GetSourceCodeOfClass("ClassName",FilePath)
这个函数将被使用超过 10000 次来从 c# 文件中获取 Srouce 代码,并且我必须从每个源文件中提取完整的源代码 class 即
" Class someName { every thing in the body including sinature} "
现在这很简单,如果一个文件包含一个class,但是会有很多源文件包含两个以上的class,而且更大的问题是在单个 class 中可能嵌套了 classes。
我想要以下东西:-
- 我想提取给定 Class 的完整源代码
- 如果文件包含两个以上的 classes 那么我只想提取指定 class. 的源代码
- 如果文件包含多个 class 并且我指定的 class 中嵌套了 classes 那么我想捕获我的 Classes 的来源以及所有嵌套 classes.
我中间有一个算法是:
1-打开文件
2 匹配正则表达式(C# classes 签名)- 参数化
@"(public|private|internal|protected|inline)?[\t ]*(static)?[\t ]class[\t ]" + sOurClassName + @"(([\t ][:][\t ]([a-zA-z]+(([ ])[,]([ ])\w+))+))?\s[\n\r\t\s]?{"
3-如果Regex在源文件中匹配 4 从那时开始复制,直到再次匹配相同的正则表达式但没有参数 正则表达式是:
@" (public|private|internal|protected)?[\t ]*(static)?[\t ]class[\t ]\w+(([\t ][:][\t ]([a-zA-z]+(([ ])[,]([ ])\w+))+))?\s[\n\r\t\s]?{"
(这是我不知道的地方,我被卡住了。我想复制第一次匹配到第二次匹配后或第一次匹配后直到结束的所有内容)
复制嵌套的 classes 仍然是一个问题,我仍在考虑它,如果有人有想法,也可以帮助我。
注意- match.groups[0] 或 match.groups[1] 这只会复制签名,但我想要 class 的完整来源,这就是我这样做的原因. ..
顺便说一句,我正在使用 C#
我同意 Nathan 的观点,即您最好使用现有的支持 C# 的解析器。尝试为该任务编写正则表达式需要大量工作,而且您不太可能在第一次尝试时就做对。它可能适用于您的第一个示例代码,甚至是前几个示例代码,但最终您会发现一些代码与您的预期略有不同,并且正则表达式将无法捕捉到重要的东西。
就是说,如果您对这种限制和风险感到满意,那么您所询问的一般技术(如果我理解正确的话……这个问题并不完全清楚)就足够普遍了,如果您希望经常使用正则表达式。需要理解的重点是,对于一个Match
对象,可以在next中调用NextMatch()
方法获取下一个匹配项,调用Regex.Match()
方法时,可以通过您要检查的子字符串的开始和长度,它会将其处理限制为该子字符串。
您可以使用后一点从一个正则表达式切换到另一个中间解析。
在您的场景中,我的理解是您想要 运行 包含特定 class 名称的正则表达式,以在文件中找到特定的 class,然后在初始匹配后的文本中搜索文件中的任何后续 class。如果第二次搜索找到某些内容,您只想 return 从第一个匹配开始到第二个匹配开始的文本。如果第二次搜索没有找到任何内容,您希望 return 从第一个匹配项的开头到整个文件结尾的文本。
如果那是正确的,那么像这样的东西应该可以工作:
string ExtractClass(string fileContents, Regex classRegex, Regex nonClassRegex)
{
Match match1 = classRegex.Match(fileContents);
if (!match1.Success)
{
return null;
}
Match match2 = nonClassRegex.Match(fileContents, match1.Index + match1.Length);
if (!match2.Success)
{
return fileContents.Substring(match1.Index);
}
return fileContents.Substring(match1.Index, match2.Index - match1.Index);
}
我应该注意,在两个 class 声明之间,或者在一个单独的 class 声明的结尾和文件的实际结尾之间,很容易有其他非白色-space 不属于 class 声明的文本。我假设你有一个处理这个问题的计划。
如果以上内容未能满足您的需求,您应该仔细检查您的问题,并对其进行编辑以确保长度和清晰度。