Невозможно преобразовать php регулярное выражение в регулярное выражение C #

1

Я хочу считать ссылки, имеющие специальный символ (подчеркивание). Я написал regex свой рабочий тон в онлайн-редакторе/редакторе php, но не работает в коде С#:

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

но в коде С# это дает ошибку компиляции

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);
  • 0
    Вы можете проверить это <(? <Tag_Name> (a) | img) \ b [^>] *? \ b (? <URL_Type> (? (2) href | src)) \ s * = \ s * (?: "(? <URL> (?: \\. | [^ \\" ] ++) * _ (?: \\. | [^ "\] ++) *)" | '(? <URL> (?: \\. | [^ \\' ] ++) * _ (?: \\. | [^ '\] ++) *)') это не работает та же проблема
  • 0
    Это точно такая же проблема, поэтому применяется тот же ответ. Я верю, что если вы поймете ответ, который я написал, вы сможете исправить это самостоятельно.
Показать ещё 9 комментариев
Теги:

1 ответ

3

Есть некоторые вещи, которые вам нужно исправить:

  1. Вы используете одиночную обратную косую черту, которая анализируется интерпретатором.net, прежде чем они будут переданы в регулярное выражение. Вместо этого используйте стенографическую строку, например: @"pattern"
  2. У вас есть непереданные кавычки в вашей строке. Чтобы избежать их в стенографической строке, используйте две двойные кавычки: @"the ""pattern"" with quotes".
  3. не поддерживает притяжательные кванторы. Вместо этого используйте атомную группу. т.е.: измените [^\\"_#?&]++ на (?>[^\\"_#?&]+).
  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);

ideone demo

Ещё вопросы

Сообщество Overcoder
Наверх
Меню