首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > perl python >

【活动】分享一下你的正则表达式的使用经历!解决方案

2012-02-05 
【活动】分享一下你的正则表达式的使用经历!在文本处理中,正则表达式的使用是必不可少的,大家分享一下自己在

【活动】分享一下你的正则表达式的使用经历!
在文本处理中,正则表达式的使用是必不可少的,大家分享一下自己在编程过程中的使用经历,也可互相讨论一下,是否有更好的方法!

分享时要写清楚:
1、原始数据内容及格式
2、正则表达式
3、欲匹配的结果


凡参加讨论者均有分!对于没有分享内容的回复,有1分的奖励,嘿嘿!

[解决办法]
顶!!!

工作上很少用到正则.

在SHELL里,替换字符用过

VIM正则用过

PYTHON查询某个字符

JAVA正则也是为了查询字符

SQL里用了一点....

都是些基础简单的了...就不贴代码了...

先把沙发坐上!!!!!!!!!!!!!!!!!!!!!
[解决办法]
目前还没用过
[解决办法]
顶,在学,看看大家都在用这个做什么。处理日志,网页内容。。。。。
[解决办法]
我用到正则表达式的情况主要有:
1.批量替换文件中的某个单词(变量)
2.动态的修改文件,比如以前做网络u盘的时候,使用了samba服务器,客户要求更加是否有建立用户来确定是否要试用账号登录,这个时候就需要动态修改samba配置文件的security选项。
3.自动发email的功能要求客户输入email,需要匹配是否正确。
用到的都是很简单的正则表达式,就没什么好说了。
[解决办法]
就拿http://topic.csdn.net/u/20111104/17/00e20201-e03a-477e-b31c-de9a8b561ac7.html?54853
做例子吧,楼主是想提取里面的数字,然后组成每行为http://test.com/Index.asp?CID=21001527这样url的文本

原始数据很有规律,要匹配的是连续的数字,有两条路走
1.把不需要的部分移除掉,剩下是行分隔的连续数字。楼主走的这条路。。。
2.只提取需要的部分,其他就无视了

很明显此例走第2条路简单,匹配需要的,组建你自己的字符串然后输出,搞定了
其实就是这么一句话的事 print 'http://test.com/Index.asp?CID='."$1\n" for(/(\d+)/g);

正向走比较费劲反向也行很简单,呵呵
[解决办法]
目前还很少用!
[解决办法]
正则很少有人用了 不过也学到了不少
[解决办法]
匹配内容:linux下的文件或目录路径,名称中可能含有- &等非字母数字下划线的字符,可带 空格-r空格数字参数,不能是从/目录开始的绝对路径
表达式:^([a-zA-Z0-9\-_\*\(\)\&\!\~\+\[\]]+\/)+([a-zA-Z0-9\-_\*\(\)\&\!\~\+\[\]]+\.[a-zA-Z0-9\-_\*\(\)\&\!\~\+\[\]]+)?( \-r [0-9]+)?$
结果:目前测试结果还行。。
[解决办法]
感觉太麻烦了,一般都上网找别人的改改。
[解决办法]
很少用,来学习的!
[解决办法]
表达式:^([a-zA-Z0-9\-_\*\(\)\&\!\~\+\[\]]+\/)+([a-zA-Z0-9\-_\*\(\)\&\!\~\+\[\]]+\.[a-zA-Z0-9\-_\*\(\)\&\!\~\+\[\]]+)?( \-r [0-9]+)?$

[解决办法]
最害怕正则表达式了、基本不用、
[解决办法]
用过好几次了,很好用,大多数是判读电话号码,日期格式,验证用户输入时用,很多时候都是上网找了,在上面修改修改就可以了
[解决办法]
平时用的没怎么记,贴一个在百度知道里面我给别人写的表达式吧, 



怎样用正则表达式去掉不要html标签代码的属性


检举|2011-9-15 16:05
提问者:1149214700 |悬赏分:10| 浏览次数:122次 

2011-9-15 19:50
最佳答案

去掉html标签: str.replace(/</?[a-zA-Z]+[^><]*>/g,"")
去掉标签里面的属性: str.replace(/<([a-zA-Z]+)\s*[^><]*>/g,"<$1>")
我亲自测试通过,操作语言javascript 楼主还有问题的话Hi 我

还有这个:http://zhidao.baidu.com/question/319650743.html 都我写的
[解决办法]
呵呵,正则很容易写出效率低的,很多人喜欢用.*?来匹配
其实能不用.的时候就不要用,比如匹配html,
应该用:<.[^>]*>
效率比:<.*?>高

还有最常见的js的trim:
在网上最常见的作法是用正则: (^\s*)|(\s*$) 可以搜索 Javascript trim,得到一大堆的类似结果如下:
String.prototype.trim= function(){return this.replace(/(^\s*)|(\s*$)/g, "");}
这个当然没有问题,但是这个正则是可以改进的,首先,用\s*,这样也可以匹配空,没有空白的字符串也会进行2次替换,而且正则里有2个捕获,而实际上捕获没有使用到,


所以比较好的作法是把*改成+,并去掉括号,用:String.prototype.trim= function(){return this.replace(/^\s+|\s+$/g, "");}

[解决办法]
什么事正则》!
[解决办法]

用的时候网上找,正则看着有点
[解决办法]
有大师说最好别用这个,有其它好的替代方法最好用别的方法实现,所以很少用。
[解决办法]
其实我用正则最喜欢干的事就是格式化文本,对正则的技能要求不高,而且能够提高效率~~

在这里我其实想说,正则不是最合适的解决方案,有些童鞋掉进去了,总觉得非要用正则去解决神马问题,更有甚者,非要把一个问题在一条正则表达式中解决不可,其实往往一条简单的正则+一个if判断语句就能解决的问题,如果非要用一条正则完成,可能可读性、健壮性==都大大折扣

比如这个案例:http://topic.csdn.net/u/20111102/15/5cc337c4-f7fe-46f4-81b1-7e156e894672.html

关于17楼童鞋的回答,扩展阅读这里有点:http://topic.csdn.net/u/20101228/23/8db2a7f7-1f51-4c24-9da1-ac8258eb1634.html?5455

玩perl的童鞋,基本上正则都差不到哪去,倒是python的童鞋,我遇到几个童鞋玩python的,对正则还是有点不重视啊
[解决办法]
匹配图片的URL,可以用:http://([\w-]+\.)+[\w-]+(:[0-9]+)*(/[\w-]+)*(/[\w-]+\.(jpg|JPG|jpeg|JPEG)),需要的图片的类型可以调整。
[解决办法]
至今没用过,项目经验比较少,做过的网站项目由于规模很小,很多校验都没用上正则表达式,但是我学过一点,感觉正则真的很强大,以后一定要尝试一下。
[解决办法]
经常用,习以为常,vim下替换字符串,sed批量替换,抓取url要正则过滤无用字符串,所谓mvc搞router seo要正则(php),apache/nginx rewrite要正则。。。
突然说要总结啥的,竟然想不起来要总结啥。。杯具
[解决办法]
去年选修的形式语言与自动机,今年开始学编译。挺复杂的。
[解决办法]
java的习惯不好,还是C++的习惯好点!个人感觉
[解决办法]
比较常用的是查找Find和SQL里边的Like,知识浅薄…
[解决办法]
有意思~~

[解决办法]
在一个描述软件版本等信息的文件里提取版本号等信息

Python code
fd = open(self.versionFile, 'rb')for buff in self.fileBuff.splitlines():    pR=re.search('(Version:\s*)(?P<name>\S[\s|\S]+)', buff, re.I)                        if pR is not None:                self._version=pR.group('name').strip()                continue
[解决办法]
没怎么用
[解决办法]
用正则表达式分析网页,分析Makefile文件。
[解决办法]
打个广告
[非版务置顶]正则表达式学习贴,搜集各类典型正则问题。 - "请勿灌水 " [推荐] [.NET技术 VB.NET]
[解决办法]
抓取网页中的内容要用到的!!
[解决办法]
grep 搜索用到
[解决办法]
1、原始数据内容及格式
中国居民身份证号
2、正则表达式
JScript code
/**身份证验证函数**/function isValidIdCardNo(num) {    num = num.toUpperCase();           //身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X。            if (!(/(^\d{15}$)|(^\d{17}([0-9]|X)$)/.test(num))) {        //alert('输入的身份证号长度不对,或者号码不符合规定!\n15位号码应全为数字,18位号码末位可以为数字或X。 ');        return false;    } //校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。    //下面分别分析出生日期和校验位    var len, re; len = num.length; if (len == 15) {        re = new RegExp(/^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/);        var arrSplit = num.match(re);  //检查生日日期是否正确        var dtmBirth = new Date('19' + arrSplit[2] + '/' + arrSplit[3] + '/' + arrSplit[4]);        var bGoodDay; bGoodDay = (dtmBirth.getYear() == Number(arrSplit[2])) && ((dtmBirth.getMonth() + 1) == Number(arrSplit[3])) && (dtmBirth.getDate() == Number(arrSplit[4]));        if (!bGoodDay) {            //alert('输入的身份证号里出生日期不对!');            return false;        } else { //将15位身份证转成18位 //校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。                    var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);            var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');            var nTemp = 0, i;            num = num.substr(0, 6) + '19' + num.substr(6, num.length - 6);            for (i = 0; i < 17; i++) {                nTemp += num.substr(i, 1) * arrInt[i];            }            num += arrCh[nTemp % 11];            return true;        }    }    if (len == 18) {        re = new RegExp(/^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/);        var arrSplit = num.match(re);  //检查生日日期是否正确        var dtmBirth = new Date(arrSplit[2] + "/" + arrSplit[3] + "/" + arrSplit[4]);        var bGoodDay; bGoodDay = (dtmBirth.getFullYear() == Number(arrSplit[2])) && ((dtmBirth.getMonth() + 1) == Number(arrSplit[3])) && (dtmBirth.getDate() == Number(arrSplit[4]));        if (!bGoodDay) {            //alert(dtmBirth.getYear());            //alert(arrSplit[2]);            //alert('输入的身份证号里出生日期不对!');            return false;        }        else { //检验18位身份证的校验码是否正确。 //校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。            var valnum;            var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);            var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');            var nTemp = 0, i;            for (i = 0; i < 17; i++) {                nTemp += num.substr(i, 1) * arrInt[i];            }            valnum = arrCh[nTemp % 11];            if (valnum != num.substr(17, 1)) {                //alert('18位身份证的校验码不正确!应该为:' + valnum);                return false;            }            return true;        }    } return false;} 


[解决办法]
1、原始数据内容及格式
IP地址(from 0.0.0.0 to 255.255.255.255,no leading zero)
2、正则表达式
((\b25[0-5]\b|\b2[0-4]\d\b|\b1\d{2}\b|\b[1-9]\d\b|\b\d\b).){3}((\b25[0-5]\b|\b2[0-4]\d\b|\b1\d{2}\b|\b[1-9]\d\b|\b\d\b))
3、欲匹配的结果
匹配,不匹配

一点想法:
regex加上文本处理/程序处理比较好用,还是以IP地址为例,上述匹配可以简化为/(\d{1,3}.){3}\d{1,3}/先过滤数字和点,然后用文本处理检测前导0(192.168.000.001不合法),最后将x.y.z.w提取出数字,检测0 <= x <= 255。
这样可以使得re的设计比较简单,逻辑比较直白灵活(相比较,纯re解决方法需要分类,另外由于前导0是由程序部分控制的,所以可以用开关来控制各种需要,比如需要前导0或者不需要)。
如果IP地址re不能说明问题,请考虑IPv6地址的纯re解决方法。

[解决办法]
初学者啊,慢慢的来学点东西,随便看呀啊 。
[解决办法]
很好,但是一不用就忘了
[解决办法]
Autoit 上用过 很简单的一点
[解决办法]
验证很多都要用要到啊
[解决办法]

Python code
mainpage_content = urllib2.urlopen(mainpage_url).read()pattern = re.compile(r'ID=(.*?)>(.*?)<')ids_names_list = re.findall(pattern, mainpage_content)
[解决办法]
啊,我这项目今年代码里倒是不曾少用
[解决办法]
有两点:
1、工作上做页面的输入验证,像用户名、金额、电话这些很常见的。。

2、娱乐,download一些网站上的图片,写个正则匹配那些图片的地址,省的一个一个的右键另存为了,但是时间并没节省多少,呵呵。。
[解决办法]
常规输入验证
匹配HTML源代码中部分文本
[解决办法]
写过一个自动提取天涯论坛帖子的工具,主要实现类似只看楼主功能,每个帖子提取结果保存到帖子标题命名的txt,使用了greta正则。其中包括从帖子列表中提取url、作者、标题、PV、回复数产生一个txt列表文件来实现根据列表自动下载htm并处理。如果加上配置文件,为不同的网站、栏目指定不同的内容提取正则式,应该可以实现支持更多的网站。另一个感受是大部分的正则引擎对逆序环视匹配有长度限制或不支持*、+等量词,只能是固定长度的PATTERN,Net Regex、deelx、.JGsoft和greta这几个引擎对逆序环视的长度没有限制,JGsoft没有发现SDK或源码可用,不过editpadPro感觉功能很强大,可以直接提取正则匹配的结果,正则的支持也很强大,大家可以试试。
[解决办法]
网页取值,url,查找,替换等等用得多但是比较基础!~
[解决办法]
验证上大量使用,还用于解析内容
[解决办法]
小弟用perl转换数据库日志用过,把数据库日志转换位syslog格式并输出到文件。里面用了些匹配文件,读取文件内容什么的。代码不难~就不上了
[解决办法]
匹配特定数字:   ^[1-9]\d*$ //匹配正整数   ^-[1-9]\d*$ //匹配负整数   ^-?[1-9]\d*$ //匹配整数   ^[1-9]\d*|0$ //匹配非负整数(正整数 + 0)   ^-[1-9]\d*|0$ //匹配非正整数(负整数 + 0)   ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ //匹配正浮点数   ^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ //匹配负浮点数   ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$ //匹配浮点数   ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$ //匹配非负浮点数(正浮点数 + 0)   ^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$ //匹配非正浮点数(负浮点数 + 0)   评注:处理大量数据时有用,具体应用时注意修正   匹配特定字符串:   ^[A-Za-z]+$ //匹配由26个英文字母组成的字符串   ^[A-Z]+$ //匹配由26个英文字母的大写组成的字符串   ^[a-z]+$ //匹配由26个英文字母的小写组成的字符串   ^[A-Za-z0-9]+$ //匹配由数字和26个英文字母组成的字符串   ^\w+$ //匹配由数字、26个英文字母或者下划线组成的字符串
[解决办法]
工作中偶尔会用到正则,上次官网的快速登录时就用到了正则来判断。
当时由于一个疏忽害我折腾了大半天。后来查出是由于一个“)”的位置不对郁闷得不行。

所以,用正则的朋友们啊,可千万要细心咯、
[解决办法]
前段时间工作刚好用了正则,是从支付平台抓到的html页面里匹配出交易数据.数据在td里
直接上代码了
Java code
        //匹配充值所在的table        Pattern tablePattern = Pattern.compile("<table width=\"100%\" class=\"classicLook\">(.*?)</table>", Pattern.CASE_INSENSITIVE);        Matcher tableMatcher = tablePattern.matcher(html.toString());                while(tableMatcher.find()) {            String table = tableMatcher.group(1).trim();                        //匹配除表头的所有tr            Pattern trPattern = Pattern.compile("<tr height=\"25\".*?>(.*?)</tr>");            Matcher trMatcher = trPattern.matcher(table);            while(trMatcher.find()) {                String tr = trMatcher.group(1).trim();                                //匹配第二个td里的充值数字                Pattern tdPattern = Pattern.compile("<td.*?>&nbsp;([\\d\\.]+)&nbsp;</td>");                Matcher tdMatcher = tdPattern.matcher(tr);                                if(tdMatcher.find(2)) {                    String td = tdMatcher.group(1).trim();                    moneys.add(td);                }            }        } 


[解决办法]
才发现我把java代码发到了脚本语言区- -!
[解决办法]
主要就是网页分析用,感觉非常不错
[解决办法]
高科技的东西啊,看不明白
[解决办法]
分享时要写清楚:
1、原始数据内容及格式
2、正则表达式
3、欲匹配的结果


凡参加讨论者均有分!对于没有分享内容的回复,有1分的奖励,嘿嘿!
[解决办法]
我用的最多还是在网页处理上面
[解决办法]

探讨
用的时候网上找,正则看着有点

[解决办法]
探讨

引用:
用的时候网上找,正则看着有点


有道理,我也是用的时候在找,从来都记不住的,正则看着有些头晕,还好平时很少用,用的也很简单。

[解决办法]
探讨

有两点:
1、工作上做页面的输入验证,像用户名、金额、电话这些很常见的。。

2、娱乐,download一些网站上的图片,写个正则匹配那些图片的地址,省的一个一个的右键另存为了,但是时间并没节省多少,呵呵。。

[解决办法]
原格式[]内的是毫秒 现在想把[]内的数字替换成 标准的lrc格式的 分:秒:毫秒
原格式:
Java code
[ar:Michael Jackson][ti:Beat it][1090] Beat It 避开![3230] 谨以此歌告诫年轻的朋友避免不必要的麻烦[8650] 暴力不能解决一切问题,只会伤害到自己[12770] 制作人:河洲[20610] 1st Verse They Told Him 他们告诉他:   [40160] Don't You Ever Come Around Here “你胆敢再来?   [42720] Don't Wanna See Your Face You Better Disappear 你最好消失![45840] The Fire's In Their Eyes 怒火在他们眼中升腾[48340] And Their Words Are Really Clear 话语也说得格外明白
[解决办法]
标准lrc 分:秒.毫秒

[解决办法]
我的总结,
1,字符串分组匹配,解析某个文件流中的固定规则字符并提取
2,字符串验证,在处理JSON格式时经常会验证规则的结果
3,很喜欢用正则表达式,在编码阶段遇到的一大堆关于字符串解析的问题都可以用正则表达式来搞定,非常简洁,但的确不太容易被别人读懂.
Java code
    /**     * 解析HTML字符串提取分组数据,格式:<br>     * &lt;div class="className"&gt;     * @throws IOException IOException     */    public void doAnalyseHTML() throws IOException {        String srcStr = doLoadFile();        //String regStr = "(<div\\sclass=\"drag\"[^>]+>[^<>]*(((?open<div[^>]*>)[^<>]*)+((?-open</div>)[^<>]*)+)*(?(open)(?!))</div>)+";        String regStr = "<div\\sclass=\"drag\"[^>]*>(<div[^>]*>(.*)</div>|.)*?</div>";        Matcher matcher = Pattern.compile(regStr, Pattern.DOTALL).matcher(srcStr);        System.out.println("isMatcher:" + matcher.matches() + ":" + matcher.groupCount());        while (matcher.find()) {            int count = matcher.groupCount();            for (int i = 0; i < count; i++) {                System.out.println(i + ":" + matcher.group(i));            }        }    }
[解决办法]
假如有如下的字符,可能是从Powerdesinger生成的报表里拷贝出来的,也可能是设计人员手敲的
Type类型
Phone电话
Address地址

程序里要用到这些信息,希望它是一个Xml文件
形如:<Item Name="" DisplayName="" />
如果就这三行文字也就罢了,但是如果是几十行,你还会一行一行的复制粘贴?
这时候正则的威力就显出来了,如果用Editplus 替换,应用正则
查找: ([a-zA-Z]+)([^\x00-\x80]+)
替换:<Item Name="\1" DisplayName="\2" />

很快
<Item Name="Type" DisplayName="类型" />
<Item Name="Phone" DisplayName="电话" />
<Item Name="Address" DisplayName="地址" />


出来了

又比如从网页上拷贝了一些代码,HTML编辑器的原因,拷贝的代码里包含了行号
形如:
1:using System;
2:using System.Collections.Generic;
3:using System.Linq;
4:using System.Text;
5:using System.Web;

你会一行一行的删除行号然后再放到自己的编辑器里去编译?

如果用Editplus 替换,应用正则
查找:\n[0-9]+:
替换:\n


这是自己用的比较多的正则,呵呵,可能会有更好的解决办法,抛砖引玉吧。
[解决办法]
正则接触很少,已经没有映像了
[解决办法]
没有用过,准备学一下
[解决办法]
主要是替换和校验 不过正则可读性不好 用得不多
[解决办法]
不怎么经常写。
[解决办法]
经常使用。包括前端js表单验证;把excel中的数据转换成sql语句……
[解决办法]
提醒:在字符串扫描问题域中,‘正则表达式’不是万能的;而‘有限状态自动机’是万能的。
[解决办法]
正则在WEB开发中可解决了不少难题
[解决办法]
开发了一版蜘蛛,抓网页上的价格时用到了正则匹配。哈哈。
[解决办法]
取网页彩票开奖号码,效果好.
正则表达式1.创建 (“<td>([\d\s]+)</td>”, 假)
[解决办法]
vs 里不用自己写的,要用直接复制出来呵呵
[解决办法]
正则表达式的用途是什么?
[解决办法]
就是为了字符统计等相关的操作,java写过正则
[解决办法]
都是大神啊,学习中
[解决办法]
具体的具体用....连匹配url的也没有万能的
[解决办法]
正则有一定的规则,不需要死记,没事看看文档,多练多想。

热点排行