RegEx匹配 - 未按预期工作

时间:2018-01-27 12:42:36

标签: c# asp.net regex

我有一串text / html。我希望根据我的RegEx模式替换部分字符串,如果它有匹配的话。 包含32个字符长GUID的href=".."的模式检查。如果找到了,我就想替换它。

我的模式在这里工作:https://regex101.com/r/IWW7bW/1

但是,当我在C#项目中实现相同的模式时,它找不到与我的数据库中相同文本的匹配。

public static string UpdateLinks(string bodyText) {
    string patternLinks = @"((\/~\/link\.aspx\?_id=([A-Z0-9]{32})))";
    bodyText = Regex.Replace(bodyText, patternLinks, "/$3/mylink.aspx");

    return bodyText;
}

如果我使用原始文本字符串@"<a href="/~/link.aspx?_id=994FE46E00D84DE9BF8050948E5496DA&amp;_z=z">",并将其硬编码到bodyText中,它会找到匹配项。 但是,相同的值,是来自数据库的字符串的一部分,并且它不匹配。 那么发生了什么?中间有某种编码,或?

来自DB的示例字符串

<p><a href="/~/link.aspx?_id=994FE46E00D84DE9BF8050948E5496DA&amp;_z=z">Link 1</a> and <a href="/~/link.aspx?_id=E7BBDF47B8784AA084985A0623490295&amp;_z=z">Link 2</a></p>

预期输出,基于上述字符串

<p><a href="/994FE46E00D84DE9BF8050948E5496DA/mylink.aspx">Link 1</a> and <a href="/E7BBDF47B8784AA084985A0623490295/mylink.aspx">Link 2</a></p>

5 个答案:

答案 0 :(得分:2)

使用此模式:

string patternLinks = @"((\/~\/link\.aspx\?_id=([A-Z0-9]{32})[^""]+))";

结果:

<p><a href="/994FE46E00D84DE9BF8050948E5496DA/mylink.aspx">Link 1</a> and <a href="/E7BBDF47B8784AA084985A0623490295/mylink.aspx">Link 2</a></p>>

答案 1 :(得分:0)

我想你只是忘了在你的模式中添加这个部分 - &amp;_z=z

 var patternLinks = @"((\/~\/link\.aspx\?_id=([A-Z0-9]{32})&amp;_z=z))";

答案 2 :(得分:0)

您正在使用PHP解析器测试正则表达式。你应该使用http://regexstorm.net/tester之类的东西。在那里你会看到它是一个分组问题。这个表达对我有用。

((\/~\/link\.aspx\?_id=)([A-Z0-9]{32}))

答案 3 :(得分:0)

试试以下正则表达式。

(?<=href="\/).*?=(.*?)&.*?"

var src = <your sample string>

try {
    var result = Regex.Replace(src, 
        @"(?<=href=""\/).*?=(.*?)&.*?""", "$1/mylink.aspx\"", 
        RegexOptions.Singleline);
    Console.WriteLine(result);
} catch (ArgumentException ex) {
    // Syntax error in the regular expression
}

这应该打印:

<p><a href="/994FE46E00D84DE9BF8050948E5496DA/mylink.aspx">Link 1</a> and <a href="/E7BBDF47B8784AA084985A0623490295/mylink.aspx">Link 2</a></p>

请参阅https://regex101.com/r/gruKQP/1/进行演示

答案 4 :(得分:0)

你的正则表达式中有太多括号,它为你提供了你不需要的额外捕获组。把它们关掉如果你想在32个字符的ID之后删除它们,你需要将它包含在你的模式中,但不要包含在捕获组中。排除32个字符ID之后的任何内容的最简单方法是简单地匹配其后不是结束引号的任何内容,因此,[^"]*

正则表达式应该是这样的:

@"\/~\/link\.aspx\?_id=([A-Z0-9]{32})[^""]*"

在比赛中删除这些额外无用的括号后,替换将只使用第一组:

"/$1/mylink.aspx"