我用正则表达式进行字符替换,但遇到空格就不进行替换了,
也许你会说把" "先替换成 但嵌套替换怎么进行啊?
比如****,而“****”有可能是,这样在替换的过程中可能会把 替换成 <img src="http://img.aaa.com/a.gif">
这样替换一次后,又成了<img src="http://img.aaa.com/a.gif">这种格式了,中间又有空格了,所以我总觉得把" "先替换成&nbsp;不是一个解决之道,大家还有别的办法吗?
我写的替换代码如下:temp = Regex.Replace(temp, @"\[URL=(?<addr>[\S\t]*?)\](?<title>[\S\t]*?)\[\/URL\]", "<a href='${addr}' TARGET='_blank'>${title}</A>",RegexOptions.IgnoreCase);这会出现上述空格问题,高手们如何改啊?

解决方案 »

  1.   

    我-_-#,看了半天没看懂,这样试下吧,看是不是你要的效果,如果不是,也不用什么分析过程,只要说一下你的源字符串是什么样的,要什么样的结果就行了string yourStr = ............;
    string result = Regex.Replace(yourStr, @"\[url=(?<addr>[^\]]*)\](?<title>[^\[]*)\[/url\]", "<a href='${addr}' TARGET='_blank'>${title}</a>", RegexOptions.IgnoreCase);
      

  2.   

    举个最简单的例子吧,UBB中aaaa就能转换成<b>aaaa</b>,aa aa,在匹配失败,无法转换成<b>aa aa</b>,这就是中间空格的问题
      

  3.   

    这是我的正则表达式:
    Regex.Replace(temp, @"\[B\](?<title>[\S\t]*?)\[\/B\]", "<B>${title}</B>",RegexOptions.IgnoreCase);
      

  4.   

    \s 
     与任何空白字符匹配。等效于 Unicode 字符类别 [\f\n\r\t\v\x85\p{Z}]。如果用 ECMAScript 选项指定了符合 ECMAScript 的行为,则 \s 等效于 [ \f\n\r\t\v]。
     
    \S 
     与任何非空白字符匹配。等效于 Unicode 字符类别 [^\f\n\r\t\v\x85\p{Z}]。如果用 ECMAScript 选项指定了符合 ECMAScript 的行为,则 \S 等效于 [^ \f\n\r\t\v]。
     
      

  5.   

    这个完全可以做到跟空格无关的string yourStr = "aaaa";
    string result = Regex.Replace(yourStr, @"\[B\]([^\[]*)\[/B\]", @"<B>$2</B>", RegexOptions.IgnoreCase);
      

  6.   

    Regex.Replace(temp, @"\[B\](?<title>[\s]*?)\[\/B\]", "<B>${title}</B>",RegexOptions.IgnoreCase);
    改成了\s也是没有效果啊
      

  7.   

    如果按你的写法,这样写string yourStr = "aaaa";
    string result = Regex.Replace(yourStr, @"\[B\](?<title>[\s\S]*?)\[\/B\]", "<B>${title}</B>", RegexOptions.IgnoreCase);
    用[\s\S]来匹配任意字符,这时要用非贪婪模式[\s\S]*?
    如果能排除和标签之间不会再出现[这个字符,可以用上面的[^\[],这里采用贪婪模式[^\[]*,会提高匹配效率
      

  8.   

    lxcnn(过客):
    string yourStr = "aa  aa";
    string result = Regex.Replace(yourStr, @"\[B\]([^\[]*)\[/B\]", @"<B>$2</B>", RegexOptions.IgnoreCase);
    你试过这样的吗?
      

  9.   

    捕获组贴的时候没改过来,是这样的,我试过了,你试过没有?string test = "aa  aa";
    string result = Regex.Replace(test, @"\[B\](?<title>[^\[]*)\[/B\]", @"<B>${title}</B>", RegexOptions.IgnoreCase);
      

  10.   

    lxcnn(过客) :
    string test = "aa  aa";
    string result = Regex.Replace(test, @"\[B\](?<title>[^\[]*)\[/B\]", @"<B>${title}</B>", RegexOptions.IgnoreCase);
    我试过了,这种情况是有效的,我最开始就是这么写的。
    但是如果这个串是这样的:
    string test = "aa  aa";
    或者是
    string test = "aa  aa";
    在进行后面的匹配的时候好像就不行了。
      

  11.   

    说下
    string test = "aa  aa";
    或者是
    string test = "aa  aa";
    这两种情况你想要的结果PS:先吃饭去了,吃饱了有了力气再回来讨论
      

  12.   

    本帖到此为止,问题应该是解决了,多谢weizhuangzhi(壮志) ,lxcnn(过客) 等朋友的帮助,经过我的测试,终于找到一种比较可行的方案。
    Regex.Replace(temp, @"\[I\](?<title>[\s\S]*?)\[\/I\]", "<I>${title}</I>",RegexOptions.IgnoreCase);
    注意是\s\S,单独的\s,或者\S都达不到我想要的效果,经过反复测试\s\S,还是可以的,它能正确的匹配例如这种:
      

  13.   

    我写了一个简单的UBB to HTML的C#代码,有谁要的留言
      

  14.   

    想测试效果可以到 http://bbs.zgclive.com 里试试,发帖子,回帖子的UBB编辑器就是这个