常用正则表达式(?i)忽略字母的大小写!

前端之家收集整理的这篇文章主要介绍了常用正则表达式(?i)忽略字母的大小写!前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

转载自:http://blog.csdn.net/iwanttoknow7/article/details/5773285@H_301_3@@H_301_3@

1@H_301_3@。@H_301_3@^@H_301_3@/d@H_301_3@+@H_301_3@$  @H_301_3@//@H_301_3@匹配非负整数(正整数+0)@H_301_3@

2@H_301_3@ 。@H_301_3@ ^@H_301_3@ [@H_301_3@ 0@H_301_3@ -@H_301_3@ 9@H_301_3@ ]@H_301_3@ *@H_301_3@ 1@H_301_3@ ][@H_301_3@ $  @H_301_3@ //@H_301_3@ 匹配正整数@H_301_3@
@H_301_3@ 3@H_301_3@ ((@H_301_3@ /d@H_301_3@ +@H_301_3@ )@H_301_3@ |@H_301_3@ (@H_301_3@ ))$  @H_301_3@ 匹配非正整数(负整数+0)@H_301_3@ 4@H_301_3@ ^-@H_301_3@ 匹配负整数@H_301_3@ 5@H_301_3@ ^-?@H_301_3@ $    @H_301_3@ 匹配整数@H_301_3@ 6@H_301_3@ (/./d@H_301_3@ ?@H_301_3@ 匹配非负浮点数(正浮点数+0)@H_301_3@ 7@H_301_3@ (([@H_301_3@ /.[@H_301_3@ ([@H_301_3@ 匹配正浮点数@H_301_3@ 8@H_301_3@ (/.@H_301_3@ 匹配非正浮点数(负浮点数+0)@H_301_3@ )))$  @H_301_3@ 匹配负浮点数@H_301_3@ 10@H_301_3@ -?@H_301_3@ )(/./d@H_301_3@ 匹配浮点数@H_301_3@ 11@H_301_3@ [A@H_301_3@ Za@H_301_3@ z]@H_301_3@ 匹配由26个英文字母组成的字符串@H_301_3@ 12@H_301_3@ Z]@H_301_3@ 匹配由26个英文字母的大写组成的字符串@H_301_3@ 13@H_301_3@ [a@H_301_3@ 匹配由26个英文字母的小写组成的字符串@H_301_3@ 14@H_301_3@ z0@H_301_3@ 匹配由数字和26个英文字母组成的字符串@H_301_3@ 15@H_301_3@ /w@H_301_3@ 匹配由数字、26个英文字母或者下划线组成的字符串@H_301_3@ 16@H_301_3@ [/w@H_301_3@ (/.[/w@H_301_3@ @[/w@H_301_3@ 匹配email地址@H_301_3@ 17@H_301_3@ zA@H_301_3@ :@H_301_3@ 匹配(/w+(-/w+)*)(/.(/w+(-/w+)*))*(/?/S*)?$  @H_301_3@ 匹配url@H_301_3@ 18@H_301_3@ 。匹配中文字符的正则表达式:[/u4e00@H_301_3@ /u9fa5]
@H_301_3@ 19@H_301_3@ 。匹配双字节字符(包括汉字在内):[@H_301_3@ /x00@H_301_3@ /xff]
@H_301_3@ 20@H_301_3@ 。应用:计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)
String.prototype.len@H_301_3@ =@H_301_3@ function(){@H_301_3@ return@H_301_3@ @H_301_3@ this@H_301_3@ .replace([@H_301_3@ /xff]@H_301_3@ /@H_301_3@ g,@H_301_3@ "@H_301_3@ aa@H_301_3@ ).length;}
@H_301_3@ 21@H_301_3@ 。匹配空行的正则表达式:/n[/s@H_301_3@ /r
@H_301_3@ 22@H_301_3@ 。匹配HTML标记的正则表达式:@H_301_3@ /<@H_301_3@ (.@H_301_3@ >@H_301_3@ .@H_301_3@ *<@H_301_3@ >|<@H_301_3@ )/@H_301_3@ />/@H_301_3@ 23@H_301_3@ 。匹配首尾空格的正则表达式:(@H_301_3@ /s@H_301_3@ (/s@H_301_3@ $)

@H_301_3@ 正则表达式用例
@H_301_3@ 、@H_301_3@ /S@H_301_3@ Z]$不能为空不能有空格只能是英文字
@H_301_3@ 、/S{@H_301_3@ ,}不能为空六位以上
@H_301_3@ $不能有空格不能非数字
@H_301_3@ 、(.@H_301_3@ )(/.jpg@H_301_3@ /.bmp)$只能是jpg和bmp格式
@H_301_3@ /d{@H_301_3@ }/@H_301_3@ }@H_301_3@ }$只能是2004@H_301_3@ 22格式
@H_301_3@ $至少选一项
@H_301_3@ {@H_301_3@ 301_3@ [/s@H_301_3@ /S]{@H_301_3@ 301_3@ +?@H_301_3@ ](([@H_301_3@ -+@H_301_3@ .]@H_301_3@ [_]@H_301_3@ @([a@H_301_3@ ))@H_301_3@ z]{@H_301_3@ }$邮件
@H_301_3@ 、/w@H_301_3@ .]/w@H_301_3@ @/w@H_301_3@ /./w@H_301_3@ ([,;]/s@H_301_3@ 输入多个地址用逗号或空格分隔邮件
@H_301_3@ (/([@H_301_3@ /))@H_301_3@ ]{@H_301_3@ }$电话号码7位或8位或前面有区号例如(@H_301_3@ 022@H_301_3@ )@H_301_3@ 87341628@H_301_3@ Z@H_301_3@ _]@H_301_3@ @[a@H_301_3@ (/.[a@H_301_3@ (/,[a@H_301_3@ $
@H_301_3@ 只能是字母、数字、下划线;必须有@和.同时格式要规范邮件
@H_301_3@ (/./w@H_301_3@ 301_3@ $上面表达式也可以写成这样子,更精练。
@H_301_3@ /@/w@H_301_3@ ((/.@H_301_3@ |-@H_301_3@ )/w@H_301_3@ $







@H_301_3@ 限定条件@H_301_3@ final@H_301_3@ StringCONDITION@H_301_3@ (?=.*[a-z])(?=.*[A-Z])(?=.*//d)@H_301_3@ ;

@H_301_3@ 允许出现的字符@H_301_3@ StringSPECIAL_CHAR@H_301_3@ [-A-Za-z0-9!$%&()/;<?{}//[//]^////]@H_301_3@ 数量@H_301_3@ StringQUANTITY@H_301_3@ {8,16}@H_301_3@ ;



@H_301_3@ 楼的回复

(@H_301_3@ ?=@H_301_3@ z])表示当前位置后面必须出现.@H_301_3@ z]的字符,这个可以理解为必须出现小写字母。
或者可以理解为某一个字符间的缝隙必须满足的条件,这个仅仅作为条件判断并不能匹配任何字
符,因为这属于非捕获组中的环视(lookarround)零宽度匹配。

举个大家常见的例子:

表达式:Win(@H_301_3@ XP)
现有字符串WinXP和WinNT,在应用这个表达式时前者能与之进行匹配,为什么呢?

当匹配器指示到(@H_301_3@ XP)时,也就是在n字母后面的缝隙,这个缝隙必须满足的
条件是:后面的字符必须是XP,如果是的话,匹配成功,否则匹配失败。由于
(@H_301_3@ XP)是匹配缝隙的,因此并不会把XP给匹配输出,而只输出了Win因此,这
个表达式的语义可以看作是:找到后面为“XP”字符所有的Win。

假如,我们把表达式写成Win(@H_301_3@ XP)(@H_301_3@ NT)这样的话,那么这个语义是:找出后面
为“XP”并且为“NT”字符所有的Win可以想象,这是个
永远无法满足的匹配。(@H_301_3@ NT)这个表示当前的缝隙必须同时满足的条件。

把这个表达式再改一下,改成Win(@H_301_3@ NT)这个表示Win的后面必须出现
XP与NT,位置和顺序都是无关的(这主要是.@H_301_3@ 的作用)。当然了这个表达式的效
率是比较低的,得向后进行两次断言。

如果字符串是WincbaXPabcNT这个字符串,当匹配指示器走到n后面的缝隙时开始
进行向后断言,首先对.@H_301_3@ XP进行断言,很明显能将cbaXP匹配成功,这时第一个断
言完成,再对.@H_301_3@ NT断言,可以看出cbaXPabcNT能与其匹配成功,这时第二个断言完
成,因此表达式Win(@H_301_3@ NT)能对WincbaXPabcNT进行匹配。

同理WincbaNTabcXP也是同样的效果

如果能理解上面的这些,对于(@H_301_3@ z])(@H_301_3@ Z])(@H_301_3@ //d)这个的理应该不会
很难吧,这个只不过是必须同时满足三个条件。

这个表达式在开始部分就进行断言,即索引为@H_301_3@ 的地方,也就是第一个字符的前面的
缝隙,这个缝隙后面的字符必须满足.@H_301_3@ z].@H_301_3@ Z].@H_301_3@ //d三个条件,也就是说
必后面必须出现至少一个小写字母、至少一个大写母、至少一个数字。


至于表达式@H_301_3@ 的使用,也就是[]内字符的转义需要注意一下。

@H_301_3@ 和@H_301_3@ 在[]结构的表达式中是有一定意义的。

[@H_301_3@ abc]表示除abc以外所有的字符,注意,这是放在最前面表示这个意思,
如果改成[a@H_301_3@ bc]这个仅表示a@H_301_3@ bc四个字符。如果需要匹配@H_301_3@ 这个字符
的话,千万不要把它放在第一个,如果一定要放在第一个的话,得使用转义符。

@H_301_3@ 在[]表示字符的范围,比如[a@H_301_3@ z]表示a与z之间的@H_301_3@ 26@H_301_3@ 个字母,
[a@H_301_3@ Z]这个表示a@H_301_3@ z和A@H_301_3@ Z的@H_301_3@ 52@H_301_3@ 个字母。使用范围得注意了,如果写成
[z@H_301_3@ a]的话,在Pattern.compile编译表达式时会对范围进行检查,这时会产
生异常,因此在使用@H_301_3@ 范围时,后面的Unicode值必须大于等于前面的Unicode
值。

如果要匹配“@H_301_3@ ”的话,尽量不要把@H_301_3@ 这个放在字符之间,可以放在[]的两边。
比如[@H_301_3@ a@H_301_3@ z]这就能匹配@H_301_3@ 个小写字母和“@H_301_3@ ”了。当然了,我们也可以写成
[a@H_301_3@ z@H_301_3@ A@H_301_3@ Z]这个可以匹配@H_301_3@ 字母和“@H_301_3@ ”,但是这样很不直观,我们宁愿写成
[a@H_301_3@ ]或者[@H_301_3@ Z]这样。





@H_301_3@ :不以某某开头,比如不以www开头


Javacode
@H_301_3@ public@H_301_3@ class@H_301_3@ Test{
@H_301_3@ static@H_301_3@ void@H_301_3@ main(String[]args){
String[]strs@H_301_3@ abc1232@H_301_3@ wwwadsf@H_301_3@ awwwfas@H_301_3@ wwadfsf@H_301_3@ ""@H_301_3@ ww@H_301_3@ www@H_301_3@ };
Stringregex@H_301_3@ (?:(?!^www).)*@H_301_3@ ;
@H_301_3@ for@H_301_3@ (Stringstr:strs){

System.out.printf(@H_301_3@ %-7s%s%n@H_301_3@ 301_3@ ?!@H_301_3@ X)专业名称为NegativeLookahead,表示字符间缝隙后面不允许出现的字符,
即匹配字符间的缝隙,如果缝隙后的字符不是X的话,那这个缝隙就匹配成功。

举个例子,aab和aac,现有表达式aa(@H_301_3@ b)这时我们能匹配到的字符串是aac,
因为aa的后面的缝隙之后不允许出现字符b,因此只有aac进行了匹配。

再来看个示例:

Javacode

@H_301_3@ main(String[]args){
Stringstr@H_301_3@ AQuickBrownFoxJumpsOverTheLazyDog@H_301_3@ ;
String[]strs@H_301_3@ str.split(@H_301_3@ (?<!^)(?=[A-Z])@H_301_3@ );
@H_301_3@ (Strings:strs){
System.out.println(s);
}
}
}


根据大写字母拆分字符串。当然了,这个使用字符串进行分析同样也能进行拆分,
但是使用正则表达式来拆的话更为便捷直观一些。

在进行这种拆分时,由于在拆分后的字符数不能减少,因此只能使用零宽度的
lookaround功能进行匹配,lookaround包括四个,即:

Javacode
(@H_301_3@ X)(@H_301_3@ ?<=@H_301_3@ ?<!@H_301_3@ X)


来看一下这个表达式:(@H_301_3@ <!^@H_301_3@ )(@H_301_3@ Z])

前面说到过(@H_301_3@ )表示缝隙后面不允许出现的东西,而(@H_301_3@ <!@H_301_3@ )表示缝隙前不允许出现的东西。
(@H_301_3@ )表示缝隙后允许出现的东西,(@H_301_3@ <=@H_301_3@ )表示缝隙前允许出现的东西。

这个表达式在拆分时,根据零宽度匹配缝隙进行拆分的,这个缝隙必须满足以下条件:

(@H_301_3@ )表示缝隙不允许前不能是行开始,即缝隙不能出现在首字母的前面。
(@H_301_3@ Z])表示缝隙后面允许出现A@H_301_3@ Z的大写字母。

这时这个表达式就匹配了下面带有@H_301_3@ 的缝隙:

Javacode
A@H_301_3@ Quick@H_301_3@ Brown@H_301_3@ Fox@H_301_3@ Jumps@H_301_3@ Over@H_301_3@ The@H_301_3@ Lazy@H_301_3@ DogPS:不加(@H_301_3@ ?<!^@H_301_3@ )的话,会变成:@H_301_3@ Dog


根据split的功能,正则表达式处理程序就根据上面的@H_301_3@ 将字符串给拆分开来了。


@H_301_3@ ,不区分大小写
不加任何限制的匹配是匹配分大小写的,但是正则表达式中可以进行改变,
有两种方式:参数式和内嵌式。

来看个示例:

Javacode
@H_301_3@ import@H_301_3@ java.util.regex.Matcher;
@H_301_3@ java.util.regex.Pattern;
@H_301_3@ Book@H_301_3@ ;
Patternpattern@H_301_3@ Pattern.compile(@H_301_3@ book@H_301_3@ );
Matchermatcher@H_301_3@ pattern.matcher(str);
System.out.println(matcher.matches());
}
}


上面的这个表达式book是不能匹配字符串Book的,这时我们只要给定编译时的参数就可以了:

Patternpattern@H_301_3@ 301_3@ int@H_301_3@ 类型的常量,值为@H_301_3@ 。表示表达式忽略大小写进行区配。

如果我们不采用Pattern和Matcher两个类来匹配的话,只是使用String的matches方法的话,
我们就不能指定表达式的编译参数了,这时就需要采用内嵌标志表达式了,与Pattern.CASE_INSENSITIVE
对应的内嵌标志表达式是(@H_301_3@ i),它有四种形式:
@H_301_3@ ,(@H_301_3@ i)
@H_301_3@ ?-@H_301_3@ i:X)
@H_301_3@ i:X)
不带有@H_301_3@ 的是开标志,带有@H_301_3@ 的是关标志。

把上面的代码改成这样:

Javacode
@H_301_3@ ;
Stringregex@H_301_3@ (?i)book@H_301_3@ ;
System.out.println(str.matches(regex));
}
}


我们就达到了同样的效果,当然这样并不是最好的,因为字符串中只有B是大写的,
我们没有必要把所有的字符都进行不区分大小写匹配,我们可以在打开标志,用(@H_301_3@ i)的
第二种形式马上关掉它:
Stringregex@H_301_3@ (?i)b(?-i)ook@H_301_3@ ;

这样的话,只有b是区分大小写了,而(@H_301_3@ i)后面的还是得区分大小写匹配的。这样写
可能看上去很不顺眼,我们还能使用第@H_301_3@ 种形式直接指定某些字符是不区分大小写的。
Stringregex@H_301_3@ (?i:b)ook@H_301_3@ ;

这样的表达式与上面的那个在语义上是相同的。就效率上肯定是优于一下子开,一下子关的。

可见内嵌标志表达式要比指定编译参数的功能强大许多。

使用建议:如果能确定某些字符的大小写时,尽量使用已确定的字符,对于不确定的可以采用
(@H_301_3@ i:X)的方式指定。因此打开不区分大小写开关时,对匹配的性能是有一定影响的。

思考一下:Stringregex@H_301_3@ (?i)b(?-i:oo)k@H_301_3@ ;这个表达式的意思?


另外:第@H_301_3@ 和第@H_301_3@ ,我没看明白需要了解什么,请在下面的楼层中具体地说明一下。



@H_301_3@ :多行匹配

在默认的情况下.是不能匹配行结束符的(行结束符有@H_301_3@ 个,具体的可以看看Pattern的APIDOC)
同样,可以像不匹配大小写匹配那样使用编译参数:Pattern.DOTALL

如果还得区分大小写的话,还得加上上面说到的Pattern.CASE_INSENSITIVE这个,举个例子:

Javacode
@H_301_3@ <table>/n@H_301_3@ <tr>/n@H_301_3@ <td>/n@H_301_3@ HelloWorld!/n@H_301_3@ </td>/n@H_301_3@ </tr>/n@H_301_3@ </table>@H_301_3@ <td>(.+?)</td>@H_301_3@ Pattern.compile(regex);
Matchermatcher@H_301_3@ pattern.matcher(str);
@H_301_3@ while@H_301_3@ (matcher.find()){
System.out.println(matcher.group(@H_301_3@ ).trim());
}
}
}


上面这个是不能从str抽取出东西的,因为td的后面带有换行符,我们只要更改一下:

Patternpattern@H_301_3@ Pattern.compile(regex,Pattern.DOTALL);

这样就行了,如果td还得不区分大小写的话,再改成:

Javacode
Patternpattern@H_301_3@ 301_3@ Pattern.CASE_INSENSITIVE);


这样的话,td哪怕是大写的这个表达式都能把td之间的字符区抽取出来。

当然和Pattern.CASE_INSENSITIVE一样,Pattern.DOTALL也有内嵌标志表达式,即(@H_301_3@ s)
s的意思表示single@H_301_3@ line就是忽略换行符什么的,只看成单行进行处理。

这个表达式使用内嵌(@H_301_3@ s)的话可以改为:

Javacode
Stringregex@H_301_3@ (?s)<td>(.+?)</td>@H_301_3@ ;如果还要不区分大小写的话,再加上i标志:Stringregex@H_301_3@ (?s)(?i)<td>(.+?)</td>@H_301_3@ ;但这样显得很拖沓,可以把它们合并起来:Stringregex@H_301_3@ (?is)<td>(.+?)</td>@H_301_3@ ;@H_301_3@ 秩序无所谓@H_301_3@

最后需要说明一下的是,我曾看到过由于不明白DOTALL,为了让.匹配行结束符,直接把表达式写成:

Javacode
Stringregex@H_301_3@ <td>((.|//s)+?)</td>@H_301_3@ ;


这样做是极其危险的,由于选择结构的匹配效率问题,这样做在比较长的字符串时会造成堆栈溢出,
使程序崩溃,如果使用DOTALL或者(@H_301_3@ s)的话就不会出现这种情况。


@H_301_3@ :2个单元的或操作

@H_301_3@ 称为多选结构,用于匹配@H_301_3@ 之中的任何一个,拿你的例子来说明:

Javacode
@H_301_3@ <imgsrc=/@H_301_3@ http:@H_301_3@ www.google.com/1.gif/"/>/n"+"<imgsrc=/"@H_301_3@ http://3w.google.com/1.gif@H_301_3@ /"/>/n"+"<imgsrc=/"@H_301_3@ http://abc.baidu.com/1.gif@H_301_3@ /"/>";@H_301_3@ Stringregex@H_301_3@ <img//ssrc=/@H_301_3@ (?:ww|3)w.google.com/1.gif/"/>";@H_301_3@ Patternpattern@H_301_3@ (matcher.find()){
System.out.println(matcher.group());
}
}
}


注意到其中的(@H_301_3@ :ww@H_301_3@ )在进行多选匹配时尽量找出多选中的规律,以减少多选的字符,
www和3w在最后一个字符可以共用,前面的不一样。

(@H_301_3@ :)的意思表示组成一组,如果没有(@H_301_3@ :)这样的话,表达式就变成了:

Javacode
Stringregex@H_301_3@ ww|3w.google.com/1.gif/"/>";@H_301_3@

这样的语义完全变掉了,@H_301_3@ 是在一组中进行选择,由于上面的那个表达式中没有组,就把整个表
达式作为了一组,使用@H_301_3@ 的话,就进行了整个表达式的多选结构了。这个表达式的意思是:
匹配@H_301_3@ <@H_301_3@ imgssrc@H_301_3@ http://ww或者是3w.google.com/1.gif@H_301_3@ />@H_301_3@ ,这样的结果并不是我们所要的。

我们仅仅需要在ww和@H_301_3@ 之间进行选择,这时只要把ww和@H_301_3@ 放在一组中进行多选择就可以了,
变成(@H_301_3@ )。

还有,在多选结构中尽量把出现频率高的放在前面,这样可以加快匹配速度。

多选结构的效率在传统型的引擎中是效率低下的,如果是单个字符的选择,比如a$@H_301_3@ &@H_301_3@ 之中的一个,
那就不要使用(@H_301_3@ :a@H_301_3@ $@H_301_3@ |&@H_301_3@ )了,可以直接使用字符类[a$@H_301_3@ ]就可以了。 说了那么多,不知道是否明白了?@H_301_3@

猜你在找的正则表达式相关文章