2012-02-01 135 views
2

我有一些文字,我想匹配和替換在C#正則表達式與空間匹配

文本將是這樣的,並且可以在一個字符串

這種多次出現的一些內容與!一些鏈接文本這裏可以是任何東西:: /東西/東西/ url.html!裏面它

我目前正在使用這個正則表達式和替換,但它不工作。它似乎只有在值中沒有空格時才起作用。

Regex r = new Regex("!!(?<first>\\S+)::(?<last>\\S+)!!"); 

content = r.Replace(content, delegate(Match match) { return ReturnCustomSpan(match.Groups[1].Value, match.Groups[2].Value); }); 

任何人都可以幫忙嗎?我是一個正則表達式noob,我無法弄清楚這一個。

+0

請告訴我你想匹配的精確模式?之間的任何事情!包含::? – Bort 2012-02-01 16:57:05

回答

4

\ S是所有非空白字符,所以你明確排除空格。如果你想匹配任何字符,請使用+而不是\ S +

2

試試這個:

!!(?<first>.+?)::(?<last>.+?)!! 

它採用非貪婪的量詞(.+?),這樣的正則表達式將正確類似這樣的匹配字符串:

This is some content with a !!Some link text here this can be anything::/something/something/url.html!! :: inside it!! 

否則會「吃」一切從!!第一次出現到最後一個,這可能不是你所期望的。

+0

+1你對非貪心的權利,但值得一提的是'!!這個 !!將:: ::消耗!!'以及。 – sln 2012-02-01 18:08:27

+0

@sln:同意。但正如OP所說,'::'之前的文本可以是任何東西,這意味着它可以包含'!!'。在你的例子中,我的正則表達式捕獲這個!將'和'::消耗'。這是好還是壞?我認爲只有OP可以回答。 – 2012-02-01 18:17:07

0

\S是你的問題,但作爲伊戈爾Korkhov提到的,你應該得到
的內容是與你的定界符同步會有麻煩。

對此沒有實際的保護標準。通過說
的定界符是!!::你不希望它存在於內容
作爲只是一個分隔符而不是它的文本部分。

如果您認爲它只作爲分隔符存在,那麼您必須使用前面提到的非貪婪方式,否則您將超出範圍。

如果你說,這可能是定界符之外的文本存在,而且形式
!! :: !!是完美的,那麼只有一種解析出來的方法。

!!((?:(?!::|!!)[\s\S])*)::((?:(?!!!|::)[\s\S])*)!!

!!(?<first>(?:(?!::|!!)[\s\S])*)::(?<last>(?:(?!!!|::)[\s\S])*)!!