昨天临时接到一个需求,要将所有.sql和.tcl里面的表名全部截取出来,并输出excel。
首先做的分析,就是sql文件里面,表名都存在什么结构下。最终定义 from 后和join 后。 但是,还存在子查询和结果子集的情况。
就是说,有可能from 和join后面跟的是一个(select * from...)的结构。
考虑了下,用逻辑去匹配并输出可能比较麻烦。 于是,技术选择了正则 。 但是又好久不用了,基本都还给书本了。就在网上狂找资料...
在历经了七七四十九分钟后,终于把正则熬出来了。
string regexText = "((\\bfrom\\b)|(\\bjoin\\b))(\\s+\\w+\\.?\\w+)\\s+\\b";
之前有几个变种版本,有一个是这个最终版的2倍多的长度.... 不过那个也基本可以实现需求。这里就不晒了。
背景介绍完了,下面切入正题:
目标字符串 string text="begin this is C# hello world this is JAVA hello world this is PYTHON hello world this is C++ hello world this is PHP hello world this is over!"
需求,匹配所有编程语言:
stringregText = "\\bis\\b\\s+\\w+\\W*\\s+\\bhello\\b";
Regex reg = new Regex(regText);
MatchCollection matchList = reg.Matches(text,0);
foreach (Match match in matchList)
{
Console.WriteLine(match.Value.Replace("is","").Replace("hello","").Trim());
}
Console.Read();
下面对这小段代码进行一个讲解:
首先解析下regText,\\bis\\b的意思是匹配is这个单次,当然这里面is可以替换为非符号、空格、换行的任意字母,都会作为一个固定单次来处理。 如果匹配符号,就是\\B?\\B,相当于把小b给大写了。 这个窍门可以广泛运用,比如\\w \\W \\d \\D \\s \\S 。 相当于都是反义。 所以只需要记住常用的小写代表什么就可以了。
\\s 的意思是代表 空格,后面跟+代表1~n个空格,跟*代表0~n个空格,跟?代表0~1个空格。 也可以跟{2}代表匹配2个空格,或者跟{1,3}代表匹配1~3个空格
好了,这样就可以看出regText的意思了吧, 找到text字符串中所有在is+一到多个空格+一到多个字符+零到多个符号+一到多个空格后面+hello。 这样就可以根据Is 开头, hello结尾的特性将需要的数据提出来了。
由于时间关系,就写这么多吧。 最后送大家两个网址,如果你想系统学习下,可以看一下。
http://www.wangqi.com/n9250c53.aspx 这里面可以找到正则里面的所有语法。
http://www.cnblogs.com/deerchao/archive/2006/08/24/zhengzhe30fengzhongjiaocheng.html 这个楼主很赞,对正则各个语法的分析很到位。楼猪一些不懂的也是从这里看到的~
有兴趣的可以分析下
string regexText = "((\\bfrom\\b)|(\\bjoin\\b))(\\s+\\w+\\.?\\w+)\\s+\\b"; 这个正则式子,如果能写出类似的,那么基本上正则高中毕业了。
原文链接:https://www.f2er.com/regex/362968.html