C# 正则表达式匹配可选的结尾,并且更愿意这样做

C# 正则表达式匹配可选的结尾,并且更愿意这样做,c#,regex,C#,Regex,我对regex不熟悉,希望与以下两行匹配: #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n" 到目前为止,我有: (\\s+)?(\")?(#)(if\\s+!defined\\(AFX_RESOURCE_DLL\\)\\s+\\|\\|\\s+defined\\()(\\w+)(\\)) 然而,最后

我对regex不熟悉,希望与以下两行匹配:

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
    "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n"
到目前为止,我有:

(\\s+)?(\")?(#)(if\\s+!defined\\(AFX_RESOURCE_DLL\\)\\s+\\|\\|\\s+defined\\()(\\w+)(\\))
然而,最后一部分给我带来了麻烦:

\r\n"
我可以匹配此选项并使其成为可选选项,没有问题,使用此选项:

(\\r\\n")
然而,如果它在那里,我希望将它捕获到一个组中(我认为贪婪是我所需要的) 到目前为止,我所有的尝试都导致它不匹配,因为它是可选的


我是否可以强制正则表达式引擎继续搜索,即使它存在,这样我就可以为它获取一个捕获组?

您想要这样的内容:

string pattern = @"(?<=#if\s+!\s*defined\s*\(\s*AFX_RESOURCE_DLL\s*\)\s*\|\|\s*defined\s*\(\s*)\w+(?=\s*\))";
string result = Regex.Replace(s, pattern, match => Hash(match.Value));
#if !defined(AFX_RESOURCE_DLL) || defined(QUZYX1RBUkdfRU5V)
   "#if !defined(AFX_RESOURCE_DLL) || defined(QUZYX1RBUkdfRU5V)\r\n"
正则表达式有点难看,但那是因为我允许更多的空间。一般包括:

(?<=...) #A positive lookbehind with text that must appear before the match
\w+      #Text to replace
(?=...)  #A positive lookahead with text that must appear after the match

<代码>(首先,你捕获了很多你显然不需要的东西,比如<代码>(μ)。考虑使用非捕获组:<代码>(?):(代码)>或者不分组,真的,像<代码> \**/COD>而不是<代码>(\s+)?< /代码> -你真的需要捕获这些空格吗?第二,你使用的是<代码>…\\r\n。模式的语法。考虑使用<代码> @“…\r\n”< /C>语法。这些将使你的生活更轻松。关于这个问题……你的意思是“代码> @……(?:\r\n)?”“”/代码>?谢谢你的回答。我确实需要这些组,因为我需要把字符串按原来的顺序重新组合起来,除了一个组被其他组替换。替换了吗?那么为什么不
Regex.Replace(输入、模式、求值器)
。NET正则表达式有lookbehind、lookbeahead等等…尤金,不幸的是,同样的事情也发生了。它与行匹配,但“(\r\n)?”的捕获组为空(因为它匹配时没有可选部分。但我需要该部分,以便可以将其渲染回输出:(好的,这是我想要的:使用AFX_TARG_ENU,创建一个散列,用散列替换该事件。行中的其他内容应该是相同的。但我不知道它是否被称为AFX_TARG_ENU或其他内容。谢谢你的回答,并为迟来的答复道歉。我尝试了你的建议,它实际上符合我的要求,所以我投了赞成票。)urs作为答案。同时,积极的前瞻和后瞻的想法在未来对我来说将是非常有价值的!再次感谢!