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


Unable to convert php regex to C# regex

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

<
  (?<Tag_Name>(a)|img)'b
  [^>]*?
  'b(?<URL_Type>(?(2)href|src))
  's*='s*
  (?:"(?<URL>(?:''.|[^''"_#?&]++)*(?:_|(?<Query>[#?&]))(?:''.|[^"'']++)*)"
  |  '(?<URL>(?:''.|[^'''_#?&]++)*(?:_|(?<Query>[#?&]))(?:''.|[^''']++)*)')

但在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);

有些事情需要纠正:

  1. 您使用的是单个反斜杠,这些反斜杠在传递给regex之前由.net解释器进行解析。请使用逐字逐句的字符串,即:@"pattern"
  2. 您的字符串中有未标注的引号。要在逐字逐句的字符串中转义它们,请使用两个双引号:@"the ""pattern"" with quotes"
  3. .net不支持所有格量词。请改用原子组。即:将CCD_ 3改变为CCD_
  4. 您可以使用相同的多行语法,忽略空白,使用RegexOptions.IgnorePatternWhitespace

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);

视频演示