簡體   English   中英

正則表達式在“任意”定界符之間的替換

[英]RegEx replacement between “arbitrary” delimiters

關於在“任意”定界符之間替換文本文件的某些部分,我遇到了一個問題。

這是我想要做的:我有如下標記:

//   [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);

但是,這沒有任何作用。 我認為使我絆倒的是括號等。 此外,我只想簡單地插入不同的注釋樣式,例如#,//,/ ** /等;

朝正確方向的任何指針將不勝感激。

像這樣使用singline選項和正則表達式

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

.*通常不會在換行符之間匹配; 您需要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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM