强烈推荐先看: https://deerchao.net/tutorials/regex/regex.htm
再看:
http://www.jb51.net/article/73929.htm
http://www.runoob.com/csharp/csharp-regular-expressions.html (\b解释错误, 匹配一个单词边界,指单词和空格间的位置)
总结:
[]表示字符范围,像[0-9]代表数字,[aeiou]匹配任何一个英文元音字母,用[\w\W]表示任意字符{n}重复n次如你查找.,或者*,应该使用转义:\.和\*| 表示满足其中任意一种规则,如 0\d{2}-\d{8}|0\d{3}-\d{7}这个匹配(如010-12345678)或(0376-2233445) (也叫分支条件)重复单个字符(直接在字符后面加上数量符号);但如果想要重复多个字符又该怎么办?可以用小括号来指定子表达式(也叫做分组)。 例如(\d{1,3}\.){3}\d{1,3} 小括号(分组),可接着实现后向引用,捕获,零宽断言等7. 接着说小括号的零宽断言(匹配后查询其中内容,例如满足函数定义后,取函数名)
(?=exp)自身出现的位置的后面能匹配表达式exp。比如\b\w+(?=ing\b),如查找I'm singing while you're dancing.时,它会匹配sing和danc。(?<=exp)自身出现的位置的前面能匹配表达式exp。比如(?<=\bre)\w+\b会匹配以re开头的单词的后半部分(除了re以外的部分),例如在查找reading a book时,它匹配ading public static void Main() { string input = "1851 1999 1950 1905 2003"; string pattern = @"(?<=19)\d{2}\b"; foreach (Match match in Regex.Matches(input, pattern)) Console.WriteLine(match.Value); }分别输出:99 ,50和05
另外个例子,从满足函数表达式字符串中提起函数名:
https://stackoverflow.com/questions/7593136/regular-expressions-to-find-c-sharp-class-and-method-names
函数行判断:
private const string IsMethodRegex = @"\b(public|private|internal|protected)\s*" + @"(static|virtual|abstract)?\s*[a-zA-Z]*\s(?<method>[a-zA-Z]+)\s*" + @"\((([a-zA-Z\[\]\<\>]*\s*[a-zA-Z]*\s*)[,]?\s*)+\)";按照例子,可以将上面的代码修改成下面后,能得到所有的年份。
static void Main(string[] args) { string input = "1851 1999 1950 1905 2003"; string pattern = @"(?<year>\d{4})\b"; //长度为4的数字 foreach (Match match in Regex.Matches(input, pattern)) Console.WriteLine(match.Groups["year"].Value); }8. 负向零宽断言:如果我们只是想要确保某个字符没有出现,但并不想去匹配它
9. (?#comment)来包含注释。
10. 贪婪与懒惰
a.*b: 如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配。a.*?b匹配最短的,它会匹配aab 和ab(懒惰)11, 平衡组/递归匹配:尚未研究,如果对xml子节点操作,可能需要用它
实战:
下面是从网址上取数据例子,取每个td节点的值
文本:<tr class=''><td>2017-07-12</td><td class='cGreen'>22.84</td><td class='cRed'>23.03</td></tr>。。。。。
Pattern: (<td>|<td class='cGreen'>|<td class='cRed'>)(.{1,12})</td>
或者采用懒惰的方式(*?): var pattern = @"(<td[\w\W]*?>)(.*?)</td>";
最初pattern没有用|来限定<td>的内容,而用的*,造成跳过中间所有的内容,直接到文本最后一个</td>,匹配的个数只有一个,
花了好长的时间才解决。。。
心得:不要轻易用*或+,它可能过滤掉中间所有的信息。 如果结果不是预期,可以将条件限定的更具体些,再测试。
