我有一系列的单词加上他们的定义,我想在定义中的每个单词实例周围添加一些bbcode。
为实现这一点,我有以下代码:
wd[1] = Regex.Replace(wd[1],@"\b"+wd[0]+@"\b","[ffa500]"+wd[0]+"[-]");
其中wd [0]是单词,wd [1]是定义。
这适用于单个单词,但在wd [0]包含逗号或感叹号时不起作用。例如,当wd [0]包含" break dance"或""但不适合" ay,caramba!"。
知道为什么会这样吗?
修改
我应该为" ay,carumba添加它!"和其他一些词我在定义中的单词周围有斜体bbcode [i] [/ i],但对于定义中找到的所有单词都不是这种情况。我希望解决方案无论如何都可以实现这一目标吗?
答案 0 :(得分:1)
这个问题是标点符号不被视为单词的一部分,特别是它不包含在\w
类中。这意味着,如果你的"字"以标点符号结尾,除非在标点符号后面紧跟一个单词,否则不会出现单词边界\b
。所以对于你的例子来说," \ bay,caramba!\ b",它将不匹配" ay,caramba!发生了什么事?"或者" ay,caramba!",但是会匹配" ay,caramba!没有空间。"。您可以尝试匹配单词边界,非单词字符或行的开头或结尾,而不是像这样。
wd[1] = Regex.Replace(
wd[1],
@"(^|\b|\W)"+wd[0]+@"(\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);