正则表达式

xiaoxiao2021-02-28  90

强烈推荐先看: 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>,匹配的个数只有一个,

花了好长的时间才解决。。。

 

心得:不要轻易用*或+,它可能过滤掉中间所有的信息。 如果结果不是预期,可以将条件限定的更具体些,再测试。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

转载请注明原文地址: https://www.6miu.com/read-73778.html

最新回复(0)