Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 超链接不匹配的复杂正则表达式问题&引用;_C#_.net_Regex - Fatal编程技术网

C# 超链接不匹配的复杂正则表达式问题&引用;

C# 超链接不匹配的复杂正则表达式问题&引用;,c#,.net,regex,C#,.net,Regex,我正在用C#中的超链接替换文本。这里的问题是链接有一个问号 案例1:没问题 输入:ASAss123 输出: 案例2:这里的问题 输入: 输出:ASASSQ123“>ASASSQ123 (注意:ASAss123的第一个出现是hyperlink,替换为http://stack.com/temp/test?order=sam&identifier= 如何纠正此问题。此处代码供您参考: mailItem.HTMLBody = Regex.Replace( mailItem.HTMLBody,

我正在用C#中的超链接替换文本。这里的问题是链接有一个问号

案例1:没问题

输入:ASAss123

输出:

案例2:这里的问题

输入:

输出:ASASSQ123“>ASASSQ123

(注意:ASAss123的第一个出现是hyperlink,替换为
http://stack.com/temp/test?order=sam&identifier=

如何纠正此问题。此处代码供您参考:

 mailItem.HTMLBody = Regex.Replace(
     mailItem.HTMLBody,
     "(?<!http://stack.com/temp/test?order=sam&identifier=)ASA[a-z][a-z][0-9][0-9][0-9](?!</a>)",
     "<a href=\"http://stack.com/temp/test?order=sam&identifier=$&\">$&</a>");
mailItem.HTMLBody=Regex.Replace(
mailItem.HTMLBody,
"(?)",
"");
这里的问题是第二个参数中的“?”。如果我在第二个和第三个参数中都去掉“?”,这就很好了

但我无法摆脱“?”,因为URL需要它才能正常工作。我如何解决这个问题


我用\?尝试了转义序列,C sharp说转义序列无法识别…

看起来你需要像
测试那样转义
测试\
,所以这并不意味着可选的
不是
你需要这样转义:

\\?
您要在正则表达式中转义?但\还需要在c字符串中转义。

c\35;无法识别序列
\?
,因为它是正则表达式,而不是c\35;字符串

为了防止C#试图识别字符串中的转义序列,并使C#像对待任何其他字符一样对待您的
\?
,您必须在字符串前面加上
@

mailItem.HTMLBody = Regex.Replace(
 mailItem.HTMLBody,
 @"(?<!http://stack.com/temp/test?order=sam&identifier=)ASA[a-z][a-z][0-9][0-9][0-9](?!</a>)",
 "<a href=\"http://stack.com/temp/test?order=sam&identifier=$&\">$&</a>");
mailItem.HTMLBody=Regex.Replace(
mailItem.HTMLBody,
@"(?)",
"");

很抱歉,这一点不太清楚。请提供一个导致您出现问题的示例链接。请提供URL。请将鼠标悬停在超链接上,您将看到示例的相应链接。不…我想要首选输出。我尝试了此C sharp,但它不允许这样做。它显示Escape Sequence UnderAzED.考虑使用<代码> @“测试>”/>代码>语法,而不是<代码>“测试\”语法…用表达式更容易。它应该工作,但是这个解决方案有一个很大的缺点:它将C逃逸序列和ReGEX转义序列全部混合在一个字符串中(在这种情况下:C逃逸序列产生正则表达式,哇!)。正则表达式本身已经非常复杂,因此此解决方案虽然正确,但可能会增加混乱,降低可读性和可维护性。这是一个有趣的观察结果!@SSITRA,那么您将如何使用正则表达式来避免此问题?这就是正则表达式。@fiver我将保持Thinkcool的正则表达式不变,并且以“@”作为前缀,让C#编译器知道,如果字符串中存在转义序列,它不应该关心这些序列。请参阅我自己的答案(这不是正确的答案,唉,反正你赢了!)