无法将php正则表达式转换为C#正则表达式

无法将php正则表达式转换为C#正则表达式,c#,php,regex,.net,C#,Php,Regex,.net,我想计算有特殊符号(下划线)的链接。我已经编写了regex,它在在线编辑器/php编辑器中运行良好,但在C#代码中不起作用: < (?(a)| img)\b [^>]*? \b(?(2)href | src)) \s*=\s* (?:"(?(?:\\.|[^\\"_#?&]++)*(?:_|(?[#?&]))(?:\\.|[^"\\]++)*)" | '(?(?:\\.|[^\\'_#?&]++)*(?:_|(?[#?&]))(?:\\.|[^'\\]++)*)') 但在C代码中,它给出了编

我想计算有特殊符号(下划线)的链接。我已经编写了regex,它在在线编辑器/php编辑器中运行良好,但在C#代码中不起作用:

<
(?(a)| img)\b
[^>]*?
\b(?(2)href | src))
\s*=\s*
(?:"(?(?:\\.|[^\\"_#?&]++)*(?:_|(?[#?&]))(?:\\.|[^"\\]++)*)"
|  '(?(?:\\.|[^\\'_#?&]++)*(?:_|(?[#?&]))(?:\\.|[^'\\]++)*)')
但在C代码中,它给出了编译错误

MatchCollection underscoreLinks = Regex.Matches(strIn, "<(?<Tag_Name>(a)|img)\b[^>]*?\b(?<URL_Type>(?(2)href|src)) \s*=\s*(?:"(?<URL>(?:\\.|[^\\"_#?&]++)*(?:_|(?<Query>[#?&]))(?:\\.|[^"\\]++)*)"|  '(?<URL>(?:\\.|[^\\'_#?&]++)*(?:_|(?<Query>[#?&]))(?:\\.|[^'\\]++)*)')", RegexOptions.IgnoreCase | RegexOptions.Multiline);
[代码>Match收集<<代码>Match收集收集收集收集收集收集数据的中文中文中文中文中文中文中文中文中文<<<<代码>Mat收集收集收集收集收集收集数据的英国警方警方警方表面表面卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖。比赛(strIn,,,]***????\b\b?\b?\b?\b((((((((2)以及(2)上述(2)以及(2)上述(2)2)2)以及(2)在场在场(2)在场在场在场在场)在场在场)的)的)在场在场在场在场在场在场在场在场在场在场在场在场在场在场在场在场在场在场在场在场在场在场在场在场在场在场在场在场在场在场在场在场在场在场在场在场在场在场的)的)的,)3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3(***)3 3 3 3 3 3*********))*)“)”,RegexOptions.IgnoreCase | RegexOptions.Multiline);
有些事情需要纠正:

  • 您使用的是单个反斜杠,.net解释器在将其传递给正则表达式之前对其进行解析。改为使用一种模式,即:
    @“模式”
  • 字符串中有未转换的引号。要在逐字字符串中转义它们,请使用:
    @“模式”加引号“
  • 不支持。改用一个字母。i、 e:将
    [^\\\”35;?&]+
    更改为
    (?>[^\\”35;?&]+
  • 您可以使用相同的多行语法,忽略空白,使用

  • 字符串模式=@”
    <
    (?(a)| img)\b
    [^>]*?
    \b(?(2)href | src))
    \s*=\s*
    (?:""(?(?>\\.|[^\\""_#?&]+)*(?:_|(?[#?&]))(?>\\.|[^""\\]+)*)""
    |  '(?(?>\\.|[^\\'_#?&]+)*(?:_|(?[#?&]))(?>\\.|[^'\\]+)*)')
    ";
    正则表达式re=新正则表达式(模式,
    RegexOptions.IgnoreCase | RegexOptions.Multiline
    |RegexOptions.ignorepattern(空格);
    MatchCollection下划线=re.Matches(文本);
    

    你能在这里检查一下吗\b(?(2)href | src))\s*=\s*(?:“(?:\.[^\\\\\\\.[^\\\\\\\]++)*”(?(?:\.[^\\\\\\\.[^\\\\\\\\\\]+*)它不起作用-它的问题完全相同,因此同样的答案适用。我相信如果你理解我写的答案,你就可以自己更正这个问题。是的,我更正了。超出范围但无法执行此操作…请帮助]*\balt\s*=\s*“[^”]+”[^>]+>您是否转义了引号(我的答案中的第2项)?
    MatchCollection underscoreLinks = Regex.Matches(strIn, "<(?<Tag_Name>(a)|img)\b[^>]*?\b(?<URL_Type>(?(2)href|src)) \s*=\s*(?:"(?<URL>(?:\\.|[^\\"_#?&]++)*(?:_|(?<Query>[#?&]))(?:\\.|[^"\\]++)*)"|  '(?<URL>(?:\\.|[^\\'_#?&]++)*(?:_|(?<Query>[#?&]))(?:\\.|[^'\\]++)*)')", RegexOptions.IgnoreCase | RegexOptions.Multiline);
    
    string pattern = @"
        <
          (?<Tag_Name>(a)|img)\b
          [^>]*?
          \b(?<URL_Type>(?(2)href|src))
          \s*=\s*
          (?:""(?<URL>(?>\\.|[^\\""_#?&]+)*(?:_|(?<Query>[#?&]))(?>\\.|[^""\\]+)*)""
          |  '(?<URL>(?>\\.|[^\\'_#?&]+)*(?:_|(?<Query>[#?&]))(?>\\.|[^'\\]+)*)')
        ";
    
    Regex re = new Regex( pattern, 
                          RegexOptions.IgnoreCase | RegexOptions.Multiline
                          | RegexOptions.IgnorePatternWhitespace);
    
    MatchCollection underscoreLinks = re.Matches(text);