c# 正则表达式基础与提高

\n换行符,|优先级最低,a|booo匹配a或booo,并不是aooo或booo

以z开头或food结尾

限定符记忆:
*:任意次 ={0,}
+:至少一次 ={1,}
?:最多一次 ={ 0,1}
{n,}:至少N次


任意单个字符:[/s/S] 或(.|\n), .在[ ]中作为普通字符



默认就是贪婪模式


item.group(0).value表示匹配的全部
item.group(1).value 表示匹配的第一个括号
WebClient wc = new WebClient(); //下载网页源码再匹配
string htmlcontent=wc.DownloadString("http://blog.sina.com.cn/s/blog_515617e60101e151.html");
MatchCollection ec = Regex.Matches(htmlcontent, @"\d+?@\w+.(com|net|org)");
foreach (Match item in ec)
{
textBox1.Text = item.Value;
}


string a = "23--45-----78----90"; label1.Text= Regex.Replace(a, @"-+", "-"); //结果23-45-78-90
整体替换:
string a = "welcome 'to' 'china'"; label1.Text= Regex.Replace(a, @"'(.+?)'", "[$1]"); //$1指的是上一个括号匹配的内容,结果为 welcome [to] [china],$0表示全部

\b 边界不能匹配的为字母或数字【a-zA-Z0-9】
string a = "tomorrow.is.sundayis a"; label1.Text= Regex.Replace(a, @"\bis\b", "**");// \b边界,判断两边是否是字母,此例子is两边非单词字母,能替换 string a = "### #### ### #### ##"; label1.Text= Regex.Replace(a, @"\b###\b", "**");// \b必须一边为单词,另一边不是,\b###\b,两边都不是单词类型,不匹配
环视匹配模式写法: 左边带不等式符号,右边不带

string a = "### w##q #j##q## #### ##";
label1.Text= Regex.Replace(a, @"(?<!j)##(?=q)", "**");//提取左边不是j右边是q的##
正则分割:
string a = "### w##q #j##q## #### ##";
string[] b= Regex.Split(a,@"(?<=j).+(?=q)",RegexOptions.IgnorePatternWhitespace);
foreach (var item in b)
{
textBox1.AppendText(item+"\t\n");//### w##q #j , q## #### ##
}

去除叠词:
string a = "杨中中中中中中中科科科科科科科科"; string b = Regex.Replace(a, @"(.)\1+", "$1"); //\1匹配括号内的正则表达式本身,表示匹配的一样,即(.)\1表示有两个一样的, $1指的是前面正则表达式括号内匹配到的文本 textBox1.AppendText(b); //杨中科

正则字符串列表过滤敏感词:可以从文件读取,格式按照下列字符串格式
//正则字符串列表过滤敏感词:可以随便添加表达式
string regc = "步枪|黄色|fuck|你妈的|办证|发票";
string regc2 = "步.{0,3}枪|黄色|fuck|你妈的|办证|发票";
string userinput = "步**枪";
bool b = Regex.IsMatch(userinput, regc2);
textBox1.AppendText(b.ToString());

提高效率,缓存正则表达式:
Regex c= new Regex(".+?");
c.IsMatch("ddd");
应用例子:
1.6位数字开头与结尾: ^[0-9]{6}$
2. 
3.完全匹配 ^--&

4. 10-20的数字,完全匹配
^(1[0-9]|20)$
5.

浙公网安备 33010602011771号