Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么C Regex.Match不接受类型Regex作为第二个参数?_C#_Regex - Fatal编程技术网

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

C# 为什么C Regex.Match不接受类型Regex作为第二个参数?,c#,regex,C#,Regex,我想知道为什么静态方法在Regex中匹配。Match接收两个强制参数和更多选项,而第二个参数不接受真正的Regex Microsoft MSDN中的方法规范为: public string Replace( string input, string replacement ) 在Visual Studio中,情况有所不同: 第二个参数用于支持正则表达式,正如正则表达式模式所说的那样 然后,以下代码无效: string str = "my {value}"; Regex

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

Microsoft MSDN中的方法规范为:

public string Replace(
    string input,
    string replacement
)
在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类型?

在您的示例中,模式是Regex

您可能想要:

var matches = pattern.Match(str);
静态版本存在的原因是,它添加了一种快速方法,以一次性方式匹配正则表达式

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

MSDN文档说明:

要匹配的正则表达式模式。表示要匹配的正则表达式的字符串表示形式,可能扩展到.Net运行时支持的常用正则表达式语法。看起来你把这个句子读成。。。还接受名为pattern的RegEx变量

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


虽然用正则表达式添加字符串可能很有用,但感觉不是很有用,因为在句子前面会显示type。

我不认为你问的问题完全清楚,但我还是会尝试回答你的部分问题

第二个参数用于支持正则表达式,正如正则表达式模式所说的那样

如果我理解正确的话,您会问,当参数的描述说明它采用正则表达式时,为什么不能传递正则表达式

正则表达式与正则表达式

在这里,区分.NET类型Regex和正则表达式的概念很重要:Regex是一种.NET类型,与颜色、字符串、StringBuilder等类似。它被设计用于表示正则表达式,并且具有使用正则表达式的方便方法。然而,它本身并不是一个正则表达式

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

方法签名

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

总而言之:您不能为模式参数传递Regex类型的实例,因为该方法不是要求Regex的实例,而是非常明确地要求以字符串表示的正则表达式


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

如果您有一个Regex实例,为什么要将该实例传递给Regex上的静态方法?为什么要传递?我不喜欢这种模式。Matchstr并没有足够的理由添加这样的覆盖…我想保留一个关于它的答案供参考。因为较新版本中有关C的VisualStudio文档与Microsofts MSDN文档不同。对于更多对此感到疑惑的人,您是否在问为什么不能将正则表达式传递给接受字符串参数的方法?你不能这样做,因为C和.NET中的类型很重要,没有任何有意义的方法将正则表达式隐式转换为字符串。我认为使用类型字符串存储正则表达式是Microsoft的一个大解决方案。我知道。但是我想知道为什么Microsoft不将MSDN和VS文档同步到正确的版本。@TonyCamargo您确定您正在查看与您的.NET版本对应的文档吗?你能提供一个MSDN文档的链接并说明你使用的是什么版本的.NET吗?我使用的是.NET 4.5。关于Regex.Match的MSDN文档是4.5。它们是一样的。@TonyCamargo-链接在哪里?仅仅因为你声称微软没有同步MSDN和VS文档,你很难理解你到底在问什么。
pattern
   Type: System.String
   The regular expression pattern to match.