2014-12-04 56 views
1

我有一系列的单词加上它们的定义,我想在定义中的单词的每个实例周围添加一些bbcode。在c#中的bbcode字符串替换问题#

为了实现这一点,我有以下代码:

wd[1] = Regex.Replace(wd[1],@"\b"+wd[0][email protected]"\b","[ffa500]"+wd[0]+"[-]"); 

其中WD [0]是字和WD [1]是定义。

这适用于单个单词,但不适用于wd [0]包含逗号或感叹号。例如,当wd [0]包含“break dance”或“”但不包含“ay,caramba!

任何想法为什么会发生这种情况?

编辑: “唉,carumba”

我要补充的是,还有一些其他的词我在定义的单词旁边有斜体bbcode [i] [/ i],但是对于定义中找到的所有单词不是这种情况。我希望解决方案能够以任何方式工作,无论如何实现这一目标?

+1

我相信之间“的Caramba”,并出现字边界“!”和“!”不是一个单词,所以在下一个单词之前有一个空格时,不会出现字边界。 – juharr 2014-12-04 15:58:59

+0

这个词本身:wd [0],包含!在那个特定的例子中,wd [0] =“ay,carumba!” – kUr4m4 2014-12-04 16:28:22

回答

1

此问题是,标点符号不被视为单词的一部分,具体而言,它不包含在\w类中。这意味着如果您的“单词”以标点符号结束,那么除非紧跟在标点符号后面有一个单词,否则将不会有单词边界\b。因此,举个例子,“\ bay,caramba!\ b”,它不会匹配“ay,caramba!发生了什么事?”或“ay,caramba!”,但会匹配“ay,caramba!No Space”。您可以尝试匹配单词边界,非单词字符或行的开头或末尾,而不是像这样。

wd[1] = Regex.Replace(
    wd[1], 
    @"(^|\b|\W)"+wd[0][email protected]"(\b|\W|$)", 
    "$1[ffa500]"+wd[0]+"[-]$2"); 

请注意,您必须添加$1$2组在情况下,他们匹配的非单词字符替换字符串(\W)。

编辑

而这里的你如何能做到不区分大小写的匹配,而不在更换变化的情况。

wd[1] = Regex.Replace(
    wd[1], 
    @"(^|\b|\W)(" + wd[0] + @")(\b|\W|$)", 
    "$1[ffa500]$2[-]$3", 
    RegexOptions.IgnoreCase); 

而且你可能要考虑逃逸wd[0]当你在模式的情况下,使用它,它含有特殊的正则表达式字符,如.*

wd[1] = Regex.Replace(
    wd[1], 
    @"(^|\b|\W)(" + Regex.Escape(wd[0]) + @")(\b|\W|$)", 
    "$1[ffa500]$2[-]$3", 
    RegexOptions.IgnoreCase); 
+0

这也没有工作:(我应该补充一点,我也有[i] [/ i] bbcode围绕“ay,carumba!”。但所有单词都不是这样,因此我希望解决方案能够正常工作 – kUr4m4 2014-12-04 16:18:47

+0

@ kUr4m4您可以具体显示wd [0]和wd [1]的值是什么时候不起作用的 – juharr 2014-12-04 16:32:58

+0

@ kUr4m4如果没有空格或其他任何字符,这个词是“as”我假设你不希望它匹配“has”或者“assume”,对吗? – juharr 2014-12-04 16:35:20