2017-03-16 41 views
1

嗯,我希望標題不要太混亂。我的任務是匹配(並替換)YZ之間的所有X匹配所有'X'從'Y'直到'Z'

我使用X,Y,Z,因爲這些值在運行時可能會有所不同,但這根本不是問題。

我試過到目前爲止是這樣的:

pattern = ".*Y.*?(X).*?Z.*"; 

哪些實際工作..但只有一個X。我簡直無法弄清楚,如何匹配那些「標籤」之間的所有X

我也試過這樣:

pattern = @"((Y|\G).*?)(?!Z)(X)" 

但這匹配所有X S,忽視了 「標籤」。

什麼是解決我的問題的正確模式?感謝提前:)

編輯

一些更多的信息:

X是一個charYZstrings

更現實生活中的測試字符串:

Some.text.with.dots [nodots]remove.dots.here[/nodots] again.with.dots 

=>匹配. s位於EEN [nodots][/nodots]

(注:我在這裏使用了XML的語法,但不能保證,所以我可以不幸不能使用簡單的XML或HTML解析器)

+2

我害怕你需要提供更真實的示例字符串。 –

+0

顯然你試過'?(X *)'......或者「X」是指字符序列? –

+0

請參閱[本演示](http://regexstorm.net/Tester?p=%28%3f%3a%5cG%28%3f!%5e%29%7cy%28%3f%3d%5b%5ez%5d * Z%29%29%圖5b%5ezx%5D *%28X%29&I = + GH + Y + HH + X + X + X + Z)。所有'x's都在組1中。或[this one](http://regexstorm.net/Tester?p=y%28%3f%3a%5b%5ezx%5d*%28x%29%29*%圖5b%5EZ%5D * Z與I = + GH + Y + HH + X + X + X + Z)。 –

回答

2

在C#中,如果需要更換一些文本塊中的一些文本,你可以用一個簡單的正則表達式匹配塊(如(?s)(START)(.*?)(END)),然後在匹配評估器中匹配塊中進行必要的替換。

在你的情況,你可以使用類似

var res = Regex.Replace(str, @"(?s)(\[nodots])(.*?)(\[/nodots])", 
    m => string.Format(
     "{0}{1}{2}", 
      m.Groups[1].Value,     // Restoring start delimiter 
      m.Groups[2].Value.Replace(".",""), // Modifying inner contents 
      m.Groups[3].Value     // Restoring end delimiter 
     ) 
    ); 

C# online demo

圖案的詳細資料

  • (?s) - 在RegexOptions.Singleline修改國旗的在線版本
  • (\[nodots]) - 組1:起始定界符(文字串[nodots]
  • (.*?) - 組2:任何0+字符儘可能少
  • (\[/nodots]) - 第3組:端定界符(文字串[/nodots]
相關問題