`
romejiang
  • 浏览: 95556 次
  • 性别: Icon_minigender_1
  • 来自: ...
社区版块
存档分类
最新评论

深入浅出正则表达式

阅读更多

 

ps:这里是以javascript的正则表达式为蓝本。 创建:
一个文本格式或正则表达式构造函数
文本格式: /pattern/flags
正则表达式构造函数: new RegExp("pattern"[,"flags"]);
参数说明:
pattern -- 一个正则表达式文本
flags -- 如果存在,将是以下值:
g: 全局匹配
i: 忽略大小写
gi: 以上组合

()可以取得匹配的值
在最后加上$的意思是匹配到最后,后面什么都没有了
在前面加上^的意思是匹配到最前面,前面什么都没有了
\w\W之类的定义符只能匹配一个字符,后面一般都带有+,*,{n},{n,m}
group,0匹配的是全局的字符串,从1往后匹配每个()里的字符串

用法一:

var  pattern =   new  RegExp( " "([a-zA-Z0-9.]+)" " , " ig " );
result 
=  pattern.exec(content);


用法二:

String.replace( / / g,  "" );


如果使用String.replace(/\n/g, ""); 必须使用//作为pattern的标志,否则replace会认为是字符串,只做第一次替换。


正则表达式对象的属性及方法
   预定义的正则表达式拥有有以下静态属性:input, multiline, lastMatch, lastParen, leftContext, rightContext和$1到$9。其中input和multiline可以预设置。其他属性的值在执行过exec或test方法后被根据不同条件赋 以不同的值。许多属性同时拥有长和短(perl风格)的两个名字,并且,这两个名字指向同一个值。(JavaScript模拟perl的正则表达式)
正则表达式对象的属性

属性 含义
$1...$9 如果它(们)存在,是匹配到的子串
$_ 参见input
$* 参见multiline
$& 参见lastMatch
$+ 参见lastParen
$` 参见leftContext
$'          参见rightContext
constructor    创建一个对象的一个特殊的函数原型
global       是否在整个串中匹配(bool型)
ignoreCase     匹配时是否忽略大小写(bool型)
input        被匹配的串
lastIndex     最后一次匹配的索引
lastParen     最后一个括号括起来的子串
leftContext    最近一次匹配以左的子串
multiline     是否进行多行匹配(bool型)
prototype     允许附加属性给对象
rightContext    最近一次匹配以右的子串
source       正则表达式模式
lastIndex     最后一次匹配的索引


正则表达式对象的方法
方法 含义
compile      正则表达式比较
exec        执行查找
test        进行匹配
toSource      返回特定对象的定义(literal representing),其值可用来创建一个新的对象。重载Object.toSource方法得到的。
toString      返回特定对象的串。重载Object.toString方法得到的。
valueOf      返回特定对象的原始值。重载Object.valueOf方法得到


构造 匹配于 字符     字符类 预定义的字符类
   
* 0次--多次
1--多次
0--1
{n} n次
{n,m} n次到m次
x 字符 x
\\ 反斜线字符
\0 n 八进制值的字符0 n (0 <= n <= 7)
\0 nn 八进制值的字符 0 nn (0 <= n <= 7)
\0 mnn 八进制值的字符0mnn 0 mnn (0 <= m <= 3, 0 <= n <= 7)
\x hh 十六进制值的字符0x hh
\u hhhh 十六进制值的字符0x hhhh
\t 制表符('\u0009' )
\n 换行符 ('\u000A' )
\r 回车符 ('\u000D' )
\f 换页符 ('\u000C' )
\a 响铃符 ('\u0007' )
\e 转义符 ('\u001B' )
\c x T对应于x的控制字符 x
[abc] a , b , or c (简单类)
[^abc] 除了a b c 之外的任意 字符(求反)
[a-zA-Z] a z A Z ,包含(范围)
[a-z-[bc]] a z ,除了b c [ad-z] (减去)
[a-z-[m-p]] a z ,除了m p [a-lq-z]
[a-z-[^def]] d , e , 或 f
. 任意字符(也许能与行终止符匹配,也许不能)
\d 数字: [0-9]
\D 非数字: [^0-9]
\s 空格符: [ \t\n\x0B\f\r]
\S 非空格符: [^\s]
\w 单词字符: [a-zA-Z_0-9]
\W 非单词字符: [^\w]


常用的匹配表达式

匹配中文字符的正则表达式: [\u4e00-\u9fa5]

匹配双字节字符(包括汉字在内):[^\x00-\xff]

应用:计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)

String.prototype.len=function(){return this.replace([^\x00-\xff]/g,"aa").length;}

匹配空行的正则表达式:\n[\s| ]*\r

匹配HTML标记的正则表达式:/<(.*)>.*<\/\1>|<(.*) \/>/

匹配首尾空格的正则表达式:(^\s*)|(\s*$)

应用:javascript中没有像vbscript那样的trim函数,我们就可以利用这个表达式来实现,如下:

String.prototype.trim  =   function ()
... {
return   this .replace( / ( ^ s * ) | (s * $) / g,  "" );
}



利用正则表达式分解和转换IP地址:

下面是利用正则表达式匹配IP地址,并将IP地址转换成对应数值的Javascript程序:

function  IP2V(ip)
... {
re
=/ (d + ).(d + ).(d + ).(d + ) / // 匹配IP地址的正则表达式
if (re.test(ip))
... {
return  RegExp.$ 1 * Math.pow( 255 , 3 )) + RegExp.$ 2 * Math.pow( 255 , 2 )) + RegExp.$ 3 * 255 + RegExp.$ 4 * 1
}

else
... {
throw   new  Error( " Not a valid IP address! " )
}

}



不过上面的程序如果不用正则表达式,而直接用split函数来分解可能更简单,程序如下:

var  ip = " 10.100.20.168 "
ip
= ip.split( " . " )
alert(
" IP值是: " + (ip[ 0 ] * 255 * 255 * 255 + ip[ 1 ] * 255 * 255 + ip[ 2 ] * 255 + ip[ 3 ] * 1 ))



匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*

匹配网址URL的正则表达式:http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?

利用正则表达式去除字串中重复的字符的算法程序:
[注:此程序不正确,原因见本贴回复]

 

 

var s="abacabefgeeii"
var s1=s.replace(/(.).*1/g,"$1")
var re=new RegExp("["+s1+"]","g")
var s2=s.replace(re,"")
alert(s1+s2) //结果为:abcefgi
 


我原来在CSDN上发贴寻求一个表达式来实现去除重复字符的方法,最终没有找到,
这是我能想到的最简单的实现方法。思路是使用后向引用取出包括重复的字符,
再以重复的字符建立第二个表达式,取到不重复的字符,两者串连。
这个方法对于字符顺序有要求的字符串可能不适用。

得用正则表达式从URL地址中提取文件名的javascript程序,如下结果为page1

s="http://www.9499.net/page1.htm"
s=s.replace(/(.*\/){0,}([^\.]+).*/ig,"$2")
alert(s)
 



利用正则表达式限制网页表单里的文本框输入内容:

用 正则表达式限制只能输入中文:onkeyup="value=value.replace(/[^\u4E00-\u9FA5]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\u4E00-\u9FA5]/g,''))"

用 正则表达式限制只能输入全角字符: onkeyup="value=value.replace(/[^\uFF00-\uFFFF]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\uFF00-\uFFFF]/g,''))"

用 正则表达式限制只能输入数字:onkeyup="value=value.replace(/[^\d]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"

用 正则表达式限制只能输入数字和英文:onkeyup="value=value.replace(/[\W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics