在正则表达式匹配中替换

时间:2012-03-26 15:38:36

标签: .net regex vb.net replace

我正在使用以下VB.net代码查找HTML中的电话号码并使其“可点击”:

 Regex.Replace(pDisp.Document.Body.innerHTML, "([0-9+ ]{3,6}[\s]{1,1}[0123456789 \-/]{4,15})", "<a href=http://DIAL/$1>$1</a>")

如果数字包含空格,则会出现问题,例如:

089 12233 455

这将替换为:

<a href=http://DIAL/089 12233 455>089 12233 455</a>

有没有办法获得

<a href=http://DIAL/08912233455>089 12233 455</a>

代替?

非常感谢!

3 个答案:

答案 0 :(得分:2)

使用:

而不是<a href=http://DIAL/$1>$1</a>
<a href=http://DIAL/$1>$0</a>

以便输出文本是整个捕获,其中包括原始格式。

答案 1 :(得分:1)

您可以使用Regex.Replace overload that accepts a MatchEvaluator找到解决方案。

示例:

Dim pattern = "([0-9+ ]{3,6}[\s]{1,1}[0123456789 \-/]{4,15})"
Dim inputs As String() = { "089 12233 455", "0711 123 00 376", "0711 5600920", "0711 62009211", "0711 620092 11", "+49 711 123 00 376", "0049 711 5600920" }

For Each input In inputs
    Console.WriteLine(input)
    Dim result = Regex.Replace(input, pattern,
        Function(m) "<a href=http://DIAL/" & m.Value.Replace(" ", "") & ">" & m.Value & "</a>")
    Console.WriteLine("Result: {0}", result)
    Console.WriteLine()
Next

lambda使用Match结果,我们在用空字符串替换空格时构建链接,并保持链接文本的原始值不变。如果连接看起来不可读,则可以使用String.Format使其更具可读性。如果href需要删除前导加号,则可以链接另一个String.Replace或在[+ ]上执行另一个正则表达式替换以删除空格和加号。

我还认为您可以将原始正则表达式缩短为"[0-9+ ]{3,6}\s[0-9 -]{4,15}"。与原始模式相比,[\s]{1,1}已缩短,[0123456789 \-/]使用0-9范围,如前所述。只要将破折号放置在角色类的开头或结尾处,就不需要对其进行转义。最后,我删除了/,因为我没有看到正斜杠的例子。

答案 2 :(得分:0)

你可以打破你的捕获组。然后,在替换中,执行以下操作:

"<a href=http://DIAL/$1$2$3>$1 $2 $3</a>"