()择一匹配C#正则表达式中的 (|)符号似乎没有一个专门的称谓姑且称之为择一匹配吧事实上像[az]也是一种择一匹配只不过它只能匹配单个字符而(|)则提供了更大的范围(ab|xy)表示匹配ab或匹配xy注意|与()在此是一个整体下面提供一些简单的示例
string x = ;
string y = ;
string z = ;
string a = ;
string b = ;
string c = ;
string d = ;
string e = ;
Regex r = new Regex(@^\+?(((+)*)|([]?[])(\\d+)*)$);
ConsoleWriteLine(x match count: + rMatches(x)Count);//
ConsoleWriteLine(y match count: + rMatches(y)Count);//
ConsoleWriteLine(z match count: + rMatches(z)Count);//
ConsoleWriteLine(a match count: + rMatches(a)Count);//
ConsoleWriteLine(b match count: + rMatches(b)Count);//
ConsoleWriteLine(c match count: + rMatches(c)Count);//
ConsoleWriteLine(d match count: + rMatches(d)Count);//
ConsoleWriteLine(e match count: + rMatches(e)Count);//
//匹配到的数最外层的括号内包含两部分((+)*)([]?[])(\\d+)*这两部分是OR的关系即正则表达式引擎会先尝试匹配如果失败则尝试匹配后一个表达式(表示[)范围中的数字)
()特殊字符的匹配下面提供一些简单的示例
string x = \\;
Regex r = new Regex(^\\\\$);
ConsoleWriteLine(r match count: + rMatches(x)Count);//
Regex r = new Regex(@^\\$);
ConsoleWriteLine(r match count: + rMatches(x)Count);//
Regex r = new Regex(^\\$);
ConsoleWriteLine(r match count: + rMatches(x)Count);//
//匹配\
string x = \;
Regex r = new Regex(^\$);
ConsoleWriteLine(r match count: + rMatches(x)Count);//
Regex r = new Regex(@^$);
ConsoleWriteLine(r match count: + rMatches(x)Count);//
//匹配双引号
()组与非捕获组以下提供一些简单的示例
string x = Live for nothingdie for something;
string y = Live for nothingdie for somebody;
Regex r = new Regex(@^Live ([az]{}) no([az]{})die \ some\$);
ConsoleWriteLine(x match count: + rMatches(x)Count);//
ConsoleWriteLine(y match count: + rMatches(y)Count);//
//正则表达式引擎会记忆()中匹配到的内容作为一个组并且可以通过索引的方式进行引用表达式中的\用于反向引用表达式中出现的第一个组即粗体标识的第一个括号内容\则依此类推
string x = Live for nothingdie for something;
Regex r = new Regex(@^Live for no([az]{})die for some\$);
if (rIsMatch(x))
{
ConsoleWriteLine(group value: + rMatch(x)Groups[]Value);//输出thing
}
//获取组中的内容注意此处是Groups[]因为Groups[]是整个匹配的字符串即整个变量x的内容
string x = Live for nothingdie for something;
Regex r = new Regex(@^Live for no(?[az]{})die for some\$);
if (rIsMatch(x))
{
ConsoleWriteLine(group value: + rMatch(x)Groups[g]Value);//输出thing
}
//可根据组名进行索引使用以下格式为标识一个组的名称(?…)
string x = Live for nothing nothing;
Regex r = new Regex(@([az]+) \);
if (rIsMatch(x))
{
x = rReplace(x $);
ConsoleWriteLine(var x: + x);//输出Live for nothing
}
//删除原字符串中重复出现的nothing在表达式之外使用$来引用第一个组下面则是通过组名来引用
string x = Live for nothing nothing;
Regex r = new Regex(@(?[az]+) \);
if (rIsMatch(x))
{
x = rReplace(x ${g});
ConsoleWriteLine(var x: + x);//输出Live for nothing
}
string x = Live for nothing;
Regex r = new Regex(@^Live for no(?:[az]{})$);
if (rIsMatch(x))
{
ConsoleWriteLine(group value: + rMatch(x)Groups[]Value);//输出(空)
}
//在组前加上?:表示这是个非捕获组即引擎将不保存该组的内容
()贪婪与非贪婪
正则表达式的引擎是贪婪只要模式允许它将匹配尽可能多的字符通过在重复描述字符(*+)后面添加?可以将匹配模式改成非贪婪请看以下示例
Code
string x = Live for nothingdie for something;
Regex r = new Regex(@*thing);
if (rIsMatch(x))
{
ConsoleWriteLine(match: + rMatch(x)Value);//输出Live for nothingdie for something
}
Regex r = new Regex(@*?thing);
if (rIsMatch(x))
{
ConsoleWriteLine(match: + rMatch(x)Value);//输出Live for nothing
}