关于在“任意”分隔符之间替换部分文本文件,我遇到了一些问题。
这是我想要做的事情:我有以下标记:
// [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);
但是,这没有任何作用。我觉得让我兴奋的是括号等。此外,我想简单地插入不同的评论风格,如#,//,/ ** /等;
任何指向正确方向的人都会受到赞赏。
答案 0 :(得分: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
答案 1 :(得分:0)
.*
通常不会在换行符之间匹配;你需要RegexOptions.Singleline
才能做到这一点。但是,您应该使用.*?
来获得非贪婪的匹配。此外,您的正则表达式不会尝试捕获[ADX START]
之前或[ADX END]
之后的行部分。最后,您使用的是Regex.Matches
,而不是Regex.Replace
,因此它实际上并未修改任何内容。
试试这个:
Regex commentRegex = new Regex(@"^.*?\[ADX START\].*?\[ADX END\].?$", RegexOptions.IgnoreCase | RegexOptions.Singleline);
string newFileContent = commentRegex.Replace(fileContent);