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

.* won't normally match across newlines; you need RegexOptions.Singleline to make it do that. However, then you should use .*? to get a non-greedy match. Also, your regex does nothing to try to capture the part of the line before [ADX START] or after [ADX END]. Finally, you're using Regex.Matches, not Regex.Replace, so it doesn't actually modify anything.

Try this:

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