- 论坛徽章:
- 27
|
本帖最后由 yifangyou 于 2012-06-01 00:51 编辑
1、在你的日常工作中会使用正则表达式解决什么样的问题?
答:我在日常工作使用正则表达式主要解决
1) 日志分析或者查找或者替换文字,例如用perl进行统计apache中某个页面的访问量,在vi里替换
2)查找处理文件, ls a[1-5].log ,find,或者egrep , 用sed 替换或者删除文件内容。
3) 在开发网站时,用javascript验证表单,在php或者java验证参数格式是否正确
4)做lucene的网络蜘蛛时,用正则进行对网页url进行过滤,或者提取网页中的部分代码。
5)用php中的正则进行解析http协议
6)在apache和nginx中用url重写实现伪静态
2、正则表达式的用法在各个语言、脚本里面略有不同,你有什么学习经验可以分享给初学者?
答:
1)perl的正则表达式是最纯正的,perl的最强项就是处理文本,我个人第一次接触正则也是从perl的学习开始。
2)php作为最接近perl的一门语言,优点是没有perl语法那么晦涩难懂,把perl的灵活多变的正则表达式给继承过来,但是使用起来没有perl那么好用,而且没有perl效率高
3)javascript使用正则时和perl比较接近,个人感觉比php的正则更好用,主要用于验证用户输入,提醒输入错误,提供用户体验,没有支持perl中的translate。
下面是我一些常用的正则表达式
javascript:- function checkIp(tmpstr)
- {
- var patrn=/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/;
- var r=patrn.exec(tmpstr)
- if(!r)
- {
- return false;
- }
- if(r[1]<=255 && r[2]<=255 &&r[3]<=255 && r[4]<=255 )
- return true;
- else
- return false;
- }
- function is_numeric(tmpstr)
- {
- var patrn=/^\d+$/;
- var r=patrn.exec(tmpstr)
- if(!r)
- {
- return false;
- }
- return true;
- }
-
- String.prototype.trim = function()
- {
- return this.replace(/(^\s*)|(\s*$)/g, "");
- }
- /*
- * 只能输入英文数字.-下划线
- * @param str input的value
- * @use <input onkeyup="value=filterchar(value)" onafterpaste="value=filterchar(value)" />
- * */
- function filterchar(str){
- var p=/[^\w\-\.]/g
- return str.replace(p,'');
- }
- /*
- * 过滤特殊字符
- * @param str input的value
- * @use <input onkeyup="value=filterschar(value)" onafterpaste="value=filterschar(value)" />
- * */
- function filterschar(str){
- var p=/[\'\"#,;&%^\$!\+=\|\\\/ ]/g
- return str.replace(p,'');
- }
复制代码 php:- /*
- 年 $matches[0]
- 月 $matches[1]
- 日 $matches[2]
- 时 $matches[3]
- 分 $matches[4]
- 秒 $matches[5]
-
- 解析Y-m-d H:i:s YmdHis Y/m/d H:i:s等等
- */
- function analytime($adate)
- {
- if(preg_match("/^(\d{4})\D{0,3}(\d{2})\D{0,3}(\d{2})\D{0,3}(\d{2})\D{0,3}(\d{2})\D{0,3}(\d{2})$/i",$adate,$matches))
- {
- array_shift($matches);
- return $matches;
- }
- return 0;
- }
- //判断md5
- function isMd5str($str)
- {
- return preg_match("/\w{32}/i",$str);
- }
复制代码 perl:- #本程序的功能为判断一个字符串是不是ip,是ipv4还是ipv6
- # 以下是用来将 IPv6 地址表示为文本字符串的三种常规形式:
- #冒号十六进制形式
- # 这是首选形式 n:n:n:n:n:n:n:n。每个 n 都表示八个 16 位地址元素之一的十六进制值。例如:
- # 3FFE:FFFF:7654:FEDA:1245:BA98:3210:4562.
- #压缩形式
- # 由于地址长度要求,地址包含由零组成的长字符串的情况十分常见。为了简化对这些地址的写入,
- # 可以使用压缩形式,在这一压缩形式中,多个 0 块的单个连续序列由双冒号符号 (::) 表示。此符号只能在地址中出现一
- #
- #次。例如,多路广播地址 FFED:0:0:0:0:BA98:3210:4562 的压缩形式为 FFED::BA98:3210:4562。
- #单播地址
- #3FFE:FFFF:0:0:8:800:20C4:0 的压缩形式为 3FFE:FFFF::8:800:20C4:0。
- #环回地址 0:0:0:0:0:0:0:1 的压缩形式为 ::1。
- #未指定的地址 0:0:0:0:0:0:0:0 的压缩形式为 ::。
- #混合形式
- # 此形式组合 IPv4 和 IPv6 地址。在此情况下,地址格式为 n:n:n:n:n:n:d.d.d.d,
- #其中每个 n 都表示六个 IPv6 高序位 16 位地址元素之一的十六进制值,每个 d 都表示 IPv4 地址的十进制值。
- #@author yifangyou
- #@version gslb 2011-03-23
- @testIP=("1.1.1.1","255.255.255.255","1.-2.3.4","a.b.c.d","CDCD:910A:2222:5498:8475:1111:3900:2020","::","::g","F:F:F::1:1","F:F:10F::","::F:F:10F","F:E:E:A:B:C:10.0.0.1","F:E:E:A:B:C:10.0.a.1","F::10.0.0.1","F:::10.0.0.1","::10.0.0.1");
- for my $ip (@testIP) {
- my $result=isIP($ip);
- if($result){
- print "[$ip] is ipv$result\n";
- }else{
- print "[$ip] is not ip\n";
- }
- }
- #计算CDCD:或者:2222的个数
- #@author yifangyou
- #@version gslb 2011-03-23
- #@return 0:表示没有找到,>0表示替换了多少个
- sub cLength{
- my $s= shift;
- return $s=~ s/([0-9a-f]{1,4}:)|(:[0-9a-f]{1,4})/ /gi;
- }
- #判断ipv4格式
- #@author yifangyou
- #@version gslb 2011-03-23
- #@return 0:表示不是ip,4:表示ipv4,6:表示ipv6
- sub isIP{
- my $tmpstr=shift;
- if(isIPv4($tmpstr)){
- return 4;
- }
- if(isIPv6($tmpstr)){
- return 6;
- }
- return 0;
- }
- #判断ipv4格式
- #@author yifangyou
- #@version gslb 2011-03-23
- #@return 0:表示不是ipv4,1:表示ipv4
- sub isIPv4
- {
- my $tmpstr=shift;
- if(@matches=$tmpstr=~/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/i)
- {
- if($matches[0]<=255 && $matches[1]<=255 &&$matches[2]<=255 && $matches[3]<=255){
- return 1;
- }
- }
- return 0;
- }
- #判断ipv6格式
- #@author yifangyou
- #@version gslb 2011-03-23
- #@return 0:表示不是ipv6,1:表示ipv6
- sub isIPv6
- {
- my $tmpstr=shift;
-
- # 判断CDCD:910A:2222:5498:8475:1111:3900:2020
- if($tmpstr=~/^([0-9a-f]{1,4}:){7}[0-9a-f]{1,4}$/i){
- return 1;
- }
- # 判断::
- if($tmpstr=~/^::$/i){
- return 1;
- }
- # F:F:F::1:1 F:F:F:F:F::1 F::F:F:F:F:1格式
- if($tmpstr=~/^(([0-9a-f]{1,4}:){1,6})((:[0-9a-f]{1,4}){1,6})$/i){
- my $c=cLength($tmpstr);
- if($c>0 && $c<=7){
- return 1;
- }
- }
-
- # F:F:10F::
- if($tmpstr=~/^([0-9a-f]{1,4}:){1,7}:$/i){
- return 1;
- }
-
- # ::F:F:10F
- if($tmpstr=~/^:(:[0-9a-f]{1,4}){1,7}$/i){
- return 1;
- }
-
- # F:E:E:A:B:C:10.0.0.1格式
- if(@matches=$tmpstr=~/^([0-9a-f]{1,4}:){6}(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/i){
- if(isIPv4($matches[1])){
- return 1;
- }
- }
- # F::10.0.0.1格式
- if(@matches=$tmpstr=~/^([0-9a-f]{1,4}:){1,5}:(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/i){
- if(isIPv4($matches[1])){
- return 1;
- }
- }
- # ::10.0.0.1格式
- if(@matches=$tmpstr=~/^::(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/i){
- if(isIPv4($matches[0])){
- return 1;
- }
- }
- return 0;
- }
复制代码 |
|