为什么C#Regex.Match不接受Regex类型作为第二个参数?

时间:2014-07-31 18:27:10

标签: c# regex

我想知道为什么Match中的静态方法Regex.Match会收到两个强制性参数和更多选项,而第二个参数不接受真正的Regex

Microsoft MSDN中的方法规范是:

public string Replace(
    string input,
    string replacement
)

在Visual Studio中它是不同的:

Visual Studio

第二个参数是"支持"正则表达式正则表达式模式匹配

然后,以下代码无效:

  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

3 个答案:

答案 0 :(得分:2)

在您的示例中,pattern 是一个正则表达式。

你可能想要:

var matches = pattern.Match(str);

静态版本存在的原因是,它添加了一种快速方式,以一次性,一次性的方式匹配正则表达式。

由于Regex的内部状态机可能需要一些时间来编译 - 实例版本存在,因此您可以创建一个实例 - 并且只需要编译一次 - 例如,如果您在循环中多次运行它,您可以看到相当大的性能提升。

答案 1 :(得分:0)

Regex.Mathc的MSDN文档说:

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

“要匹配的正则表达式模式。”表示“要匹配的正则表达式的字符串表示,可能扩展为.Net运行时支持的常规正则表达式语法”。您似乎将该句子读作“......也接受名为RegEx的{​​{1}}变量”。

请注意regular expression是正常的计算机科学/语言理论术语,不必与任何框架中的任何特定类匹配。

虽然添加“带有正则表达式的字符串”可能很有用,但它感觉不太有用,因为类型会在句子之前显示。

答案 2 :(得分:0)

我认为你所要求的并不完全清楚,但无论如何我都会回答你的部分问题。

  

第二个参数是“支持”Regex,正如所说的正则表达式模式匹配

如果我理解正确的话,你会问为什么当参数的描述说它需要一个正则表达式时你不能传递Regex

正则表达式与正则表达式

此处区分.NET类型Regex和正则表达式的概念非常重要:Regex是一种.NET类型,就像ColorStringStringBuilder等。它旨在表示一个正则表达式,它有方便的方法来处理正则表达式。但是,它本身并不是一个正则表达式。

另一方面,字符串“abc。*”是a regular expression,不仅仅是在C#中,而是在一般意义上。并非所有字符串都是有效的正则表达式,但有些字符串是正则表达式,可用于描述匹配字符串的范围。

方法签名

上述文档说明该方法采用pattern类型的参数string。与参数关联的注释指出模式必须表示有效的正则表达式。因此,它必须符合描述.NET中正则表达式的规则,并且不能包含“?[---]<>”,因为该字符串不代表正则表达式(我假设,我没有测试了它。)

总结一下:你不能为pattern参数传递Regex类型的实例,因为该方法不是要求Regex的实例,它非常明确地要求正则表达式,表示为字符串

注意:可以找到与您正在查看的方法重载匹配的文档here