感谢@InSync让我意识到Regex选项。忽略模式空白
选项。也要感谢@sln。这里有一个更长的答案。
文档中的12个元字符可以被描述为正常的元字符。原因是Regex。Escape支持额外的2个字符(空格和numberSign),因为当使用Regex选项。忽略模式空白
,另外2个字符变为元字符。
在“正常”模式下,即没有Regex选项。忽略模式空白
、numberSign和空白都是文字,也就是说,它们不是元字符。
Regex选项。忽略模式空白
让您编写自我记录模式。具体来说,该选项允许引入不属于模式的空白,并在numberSign之后引入不属于该模式的注释。它有效地将空白变成了将被忽略的模式元字符。它有效地将numberSign转换为一个模式元字符,该元字符将被输入,随后的所有内容都将被忽略。我们引入了要忽略的字符,因为它们是文档。
使用此选项意味着您必须转义空白才能使其成为文字。使用此选项意味着您必须转义numberSign才能使其成为文字。
Regex r;r=新Regex(“a a a#comment”);//在正常模式下,空白为文字,numberSign为文字调试。断言(r.IsMatch(“aaa”)==false);调试。断言(r.IsMatch(“a a a#comment”);//在正常模式下,转义空格和转义numberSign是不必要的,但没有任何有害影响//解释。。。转义元字符意味着使其成为文字//在正常模式下,空白不是元字符,因此效果是取一个文本并使其成为文本,但没有效果//在正常模式下,numberSign不是元字符,因此其效果是采用文本并使其成为无效的文本r=新Regex(Regex.Escape(“a a a#comment”));调试。断言(r.IsMatch(“aaa”)==false);调试。断言(r.IsMatch(“a a a#comment”);r=新Regex(“a a a#comment”,RegexOptions.IgnorePatternWhitespace);//该选项使空白和注释变得无关紧要调试。断言(r.IsMatch(“aaa”));调试。断言(r.IsMatch(“a a a#comment”)==false);//转义空格和转义号由人工编码的转义序列签名r=新Regex(@“a\a\a\\#注释”,RegexOptions.IgnorePatternWhitespace);调试。断言(r.IsMatch(“aaa”)==false);调试。断言(r.IsMatch(“a a a#comment”));//使用Regex转义空白和转义numberSign。逃生r=新Regex(Regex.Escape(“a a a#comment”),RegexOptions。忽略模式空白);调试。断言(r.IsMatch(“aaa”)==false);调试。断言(r.IsMatch(“a a a#comment”));
旁白。。。启用另外两个元字符的选项让我想起了连字符。连字符不在由12个元字符组成的“正常”集合中,但连字符在方括号的上下文中变为元字符。
r=新Regex(“a-z[P-r]”);
第一个连字符是文字,第二个连字符定义了一个组,模式正好从中匹配一个字符。