Интересно, почему статический метод Match в Regex.Match получает два обязательных параметра и несколько дополнительных параметров, а второй параметр не принимает истинное значение Regex.

Спецификация метода в Microsoft MSDN:

public string Replace(
    string input,
    string replacement
)

В Visual Studio все иначе:

Visual Studio

Второй параметр предназначен для "поддержки" Regex, как говорит Соответствующий шаблон регулярного выражения .

Тогда следующий код недействителен:

  string str = "my {value}";
  Regex pattern = new Regex(@"\{[a-zA-Z_][a-zA-Z0-9_]*\}");
  int matches = Regex.Match(str, pattern);

Но когда:

string pattern = @"\{[a-zA-Z_][a-zA-Z0-9_]*\}";

Это действительно так.

Я схожу с ума или это действительно проблема?

Я знаю, там написано, что получает "строку", но не правильно ли также поддерживать тип Regex?

-1
Marcelo Camargo 31 Июл 2014 в 22:27

3 ответа

Лучший ответ

Не думаю, что вам до конца понятно, о чем вы спрашиваете, но я все равно попытаюсь ответить на часть вашего вопроса.

Второй параметр предназначен для "поддержки" Regex, как говорит шаблон регулярного выражения для соответствия

Если я правильно вас понял, вы спрашиваете, почему вы не можете передать Regex, когда в описании параметра указано, что он принимает регулярное выражение.

Регулярное выражение и регулярные выражения

Здесь важно различать тип .NET Regex и концепцию регулярного выражения: Regex - это тип .NET, такой же, как Color, String, StringBuilder и т. Д. Он предназначен для представления регулярного выражения и имеет удобные методы для работы с регулярными выражениями. Однако само по себе это не регулярное выражение.

С другой стороны, строка символов «abc. *» Является регулярным выражением, а не просто в C #, но в общем смысле. Не все строки являются допустимыми регулярными выражениями, но некоторые строки являются регулярными выражениями и могут использоваться для описания набора совпадающих строк.

Сигнатуры методов

В документации выше указано, что метод принимает параметр pattern типа string. Комментарии, связанные с параметром, утверждают, что шаблон должен представлять допустимое регулярное выражение. Таким образом, он должен соответствовать правилам, описывающим регулярные выражения в .NET, и не может, скажем, содержать "? [---] <>", потому что эта строка не представляет собой регулярное выражение (я полагаю, я не тестировал ее ).

Подводя итог: вы не можете передать экземпляр типа Regex для параметра шаблона, потому что метод не запрашивает экземпляр Regex, он очень явно запрашивает регулярное выражение выражается в виде строки .

Примечание. Документацию, соответствующую перегрузке метода, которую вы просматриваете, можно найти здесь.

0
Rune 31 Июл 2014 в 19:14

В документации MSDN для Regex.Mathc говорится :

pattern
   Type: System.String
   The regular expression pattern to match. 

«Соответствующий шаблон регулярного выражения». означает «Строковое представление регулярного выражения для сопоставления с возможными расширениями обычного синтаксиса регулярных выражений, поддерживаемого средой выполнения .Net». Похоже, вы читали предложение как «... также принимает переменную RegEx с именем pattern».

Обратите внимание, что регулярное выражение является обычным термином в области компьютерных наук / теории языка и не обязательно должно соответствовать какому-либо конкретному классу. в любых рамках.

Хотя может быть полезно добавить «Строку с регулярным выражением», это не кажется очень полезным, потому что тип отображается непосредственно перед предложением.

0
Alexei Levenkov 31 Июл 2014 в 19:08

В вашем примере pattern является регулярным выражением.

Вы наверняка захотите:

var matches = pattern.Match(str);

Причина, по которой существует статическая версия, заключается в том, что она добавляет быстрый способ сопоставления регулярного выражения одноразовым одноразовым способом.

Поскольку внутренним конечным автоматам Regex может потребоваться время для компиляции - версия экземпляра существует, поэтому вы можете создать экземпляр - и вам нужно скомпилировать его только один раз - например, если вы запускали его много раз в цикле, вы могли бы увидеть значительный улучшение производительности.

2
Dave Bish 31 Июл 2014 в 18:33