加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则表达式

发布时间:2020-12-13 21:56:34 所属栏目:百科 来源:网络整理
导读:强烈推荐先看:https://deerchao.net/tutorials/regex/regex.htm 再看: http://www.jb51.net/article/73929.htm http://www.runoob.com/csharp/csharp-regular-expressions.html(b解释错误, 匹配一个单词边界,指单词和空格间的位置) 总结: []表示字符

强烈推荐先看:https://deerchao.net/tutorials/regex/regex.htm

再看:

http://www.aspzz.cn/article/73929.htm

http://www.runoob.com/csharp/csharp-regular-expressions.html(b解释错误,匹配一个单词边界,指单词和空格间的位置)


总结:

  1. []表示字符范围,像[0-9]代表数字,[aeiou]匹配任何一个英文元音字母,用[wW]表示任意字符
  2. {n}重复n次
  3. 如你查找.,或者*,应该使用转意:.和*
  4. | 表示满足其中任意一种规则,如 0d{2}-d{8}|0d{3}-d{7}这个匹配(如010-12345678)或(0376-2233445) (也叫分支条件)
  5. 重复单个字符(直接在字符后面加上数量符号);但如果想要重复多个字符又该怎么办?可以用小括号来指定子表达式(也叫做分组)。 例如(d{1,3}.){3}d{1,3}
  6. 小括号(分组),可接着实现后向引用,捕获,零宽断言等
7. 接着说小括号的零宽断言(查询用)
  • (?=exp)自身出现的位置的后面能匹配表达式exp。比如bw+(?=ingb),如查找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


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[wW]*?>)(.*?)</td>";


最初pattern没有用|来限定<td>的内容,而用的*,造成跳过中间所有的内容,直接到文本最后一个</td>,匹配的个数只有一个,
花了好长的时间才解决。。。

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读