正则表达式与空间匹配

正则表达式与空间匹配

问题描述:

我有一些文字,我想匹配和替换在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

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

试试这个:

!!(?<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

\S是你的问题,但作为伊戈尔Korkhov提到的,你应该得到
的内容是与你的定界符同步会有麻烦。

对此没有实际的保护标准。通过说
的定界符是!!::你不希望它存在于内容
作为只是一个分隔符而不是它的文本部分。

如果您认为它只作为分隔符存在,那么您必须使用前面提到的非贪婪方式,否则您将超出范围。

如果你说,这可能是定界符之外的文本存在,而且形式
!! :: !!是完美的,那么只有一种解析出来的方法。

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

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