正则表达式反向引用替换奇怪

时间:2017-02-10 13:53:34

标签: c# regex

我有以下代码段:

API_URL=http://api.test.com ng serve

其中包含一个文本块(var escapedBlock = Regex.Escape(retString); var escapedSearch = Regex.Escape(searchText); string highlightedString = Regex.Replace(escapedBlock, "(" + escapedSearch + ")", Regex.Escape("<span style='background-color: #FFFF00'>") + "$1" + Regex.Escape("</span>"), RegexOptions.IgnoreCase); return Regex.Unescape(highlightedString); )并根据您传递给它的参数(retString)返回突出显示的字符串。我使用对第一个匹配组的反向引用来确保匹配的大写字母仍然存在于已返回的突出显示文本中。

除了一种情况之外,这在游泳方面起作用:数字后跟一段时间。

searchText
.5 - works
5 - works
test - works

虽然搜索5. - broken工作正常,但搜索.5却没有 - 6.5方法似乎根本没有匹配。

我最初的怀疑是与逃避反向引用(Replace)的值的实际结果有关,但如果我直接逃避反向引用,我最终得到一堆无效转义字符的错误。

我在这里缺少什么?

1 个答案:

答案 0 :(得分:2)

在转义输入字符串时,在点前添加文字\,而5\.模式仅匹配5.,而不是5\.。您需要删除var escapedBlock = Regex.Escape(retString);并在Regex.Replace上应用retString并返回highlightedString,而不会取消任何操作。

使用

var escapedSearch = Regex.Escape(searchText);
var highlightedString = Regex.Replace(retString, escapedSearch,
    "<span style='background-color: #FFFF00'>$&</span>"),
     RegexOptions.IgnoreCase);
return highlightedString;

请注意,您无需捕获组来访问整个匹配值,您可以使用$&反向引用。