我想知道为什么Match
中的静态方法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
?
答案 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类型,就像Color
,String
,StringBuilder
等。它旨在表示一个正则表达式,它有方便的方法来处理正则表达式。但是,它本身并不是一个正则表达式。
另一方面,字符串“abc。*”是a regular expression,不仅仅是在C#中,而是在一般意义上。并非所有字符串都是有效的正则表达式,但有些字符串是正则表达式,可用于描述匹配字符串的范围。
方法签名
上述文档说明该方法采用pattern
类型的参数string
。与参数关联的注释指出模式必须表示有效的正则表达式。因此,它必须符合描述.NET中正则表达式的规则,并且不能包含“?[---]<>”,因为该字符串不代表正则表达式(我假设,我没有测试了它。)
总结一下:你不能为pattern参数传递Regex
类型的实例,因为该方法不是要求Regex
的实例,它非常明确地要求正则表达式,表示为字符串。
注意:可以找到与您正在查看的方法重载匹配的文档here。