2

我在替换“任意”分隔符之间的部分文本文件时遇到了一些问题。

这是我想要做的:我有如下标记:

//   [ADX START] ANYTHING //   [ADX END] 

<!--    [ADX START] --> ANYTHING <!-- [ADX END]  -->

/*   
 [ADX START] */  ANYTHING /*  [ADX END]        */

所以,这些是不同的评论风格,我想抓住开头的 [ADX START](包括周围的评论),然后是中间的文本,最后是最后的 [ADX END]。

因此,我给它一个像这样的文本文件:

test.php:
<?php
BEFORE    
// [ADX START]
REMOVEME
// [ADX END]
AFTER

test.css:
BEFORE    
/* [ADX START]*/
REMOVEME
/*[ADX END] */
AFTER

变成:

test.php:
<?php
BEFORE    
AFTER

test.css:
BEFORE    
AFTER

等等。如您所见,注释样式和分隔符之间可以有任意数量的空格(或没有空格)。

所以,到目前为止,我想出的是以下内容:

string newFileContent = Regex.Matches(fileContent, "(\\[ADX START\\].*\\[ADX END\\])", RegexOptions.IgnoreCase);

但是,这无济于事。我认为让我绊倒的是括号等;此外,我希望能够简单地插入不同的注释样式,例如 #、//、/**/ 等;

任何指向正确方向的指针都将不胜感激。

4

2 回答 2

1

像这样使用单行选项和正则表达式

string strRegex =@"(\/\/|\/\*).*?\[ADX START\].*?\[ADX END\]\s*(\*\/)?";
                         ^                      ^                 ^
                         |                      |                 |->match */ 0 or 1 time
                         |                      |
                         |                      |->match lazily till the first ADX END
                         |->match // or /*
string s=Regex.Replace(fileContent,strRegex,"",RegexOptions.Singleline);//replace it
于 2012-11-03T16:28:10.180 回答
0

.*通常不会跨换行符匹配;你需要RegexOptions.Singleline让它做到这一点。但是,那么您应该使用.*?来获得非贪婪匹配。此外,您的正则表达式不会尝试捕获之前[ADX START]或之后的部分行[ADX END]。最后,您使用的是Regex.Matches, not Regex.Replace,因此它实际上并没有修改任何内容。

试试这个:

Regex commentRegex = new Regex(@"^.*?\[ADX START\].*?\[ADX END\].?$", RegexOptions.IgnoreCase | RegexOptions.Singleline);
string newFileContent = commentRegex.Replace(fileContent);
于 2012-11-03T16:24:25.170 回答