正则表达式必知必会
基本概念 ? 字符组成 普通字符 由所有那些未显式指定为元字符的打印和非打印字符组成。这包括所有的大写和小写字母字符,所有数字,所有标点符号以及一些符号。 非打印字符
? ? ? ? ? ? ? 特殊字符 所谓特殊字符,就是一些有特殊含义的字符,如上面说的"*.txt"中的*,简单的说就是表示任何字符串的意思。如果要查找文件名中有*的文件,则需要对*进行转义,即在其前加一个。ls *.txt。正则表达式有以下特殊字符。
限定符
定位符 用来描述字符串或单词的边界,^和$分别指字符串的开始与结束,b描述单词的前或后边界,B表示非单词边界。不能对定位符使用限定符。 选择 后向引用 ? 运算优先级
? ? ? ? 匹配规则 基本模式匹配
例如:^bucket$只匹配字符串"bucket"。如果一个模式不包括^和$,那么它与任何包含该模式的字符串匹配。 例如:模式once与字符串Who kept all of his cash in a bucket.是匹配的。在该模式中的字母(o-n-c-e)是字面的字符,也就是说,他们表示该字母本身,数字也是一样的。 其他一些稍微复杂的字符,如标点符号和白字符(空格、制表符等),要用到转义序列。所有的转义序列都用反斜杠()打头。制表符的转义序列是:t。所以如果我们要检测一个字符串是否以制表符开头,可以用这个模式:^t 类似的,用n表示“新行”,r表示回车。其他的特殊符号,可以用在前面加上反斜杠,如反斜杠本身用表示,句号.用.表示,以此类推。 字符簇 [AaEeIiOoUu] 这个模式与任何元音字符匹配,但只能表示一个字符。用连字号可以表示一个字符的范围,如: [a-z] //匹配所有的小写字母 [A-Z] //匹配所有的大写字母 [a-zA-Z] //匹配所有的字母 [0-9] //匹配所有的数字 [0-9.-] //匹配所有的数字,句号和减号 [ frtn] //匹配所有的白字符 同样的,这些也只表示一个字符,这是一个非常重要的。如果要匹配一个由一个小写字母和一位数字组成的字符串,比如"z2"、"t6"或"g7",但不是"ab2"、"r2d3" 或"b52"的话,用这个模式: ^[a-z][0-9]$//尽管[a-z]代表26个字母的范围,但在这里它只能与第一个字符是小写字母的字符串匹配。
前面曾经提到^表示字符串的开头,但它还有另外一个含义。当在一组方括号里使用^是,它表示“非”或“排除”的意思,常常用来剔除某个字符。还用前面的例子,我们要求第一个字符不能是数字: ^[^0-9][0-9]$ 这个模式与"&5"、"g7"及"-2"是匹配的,但与"12"、"66"是不匹配的。下面是几个排除特定字符的例子: [^a-z] //除了小写字母以外的所有字符 [^/^] //除了()(/)(^)之外的所有字符 [^"‘] //除了双引号(")和单引号(‘)之外的所有字符 特殊字符"." (点,句号)在正规表达式中用来表示除了“新行”之外的所有字符。所以模式"^.5$"与任何两个字符的、以数字5结尾和以其他非“新行”字符开头的字符串匹配。模式"."可以匹配任何字符串,除了空串和只包括一个“新行”的字符串。 PHP的正规表达式有一些内置的通用字符簇,列表如下:
? ? ? ? ? ? ? ? 确定重复出现 到现在为止,你已经知道如何去匹配一个字母或数字,但更多的情况下,可能要匹配一个单词或一组数字。一个单词有若干个字母组成,一组数字有若干个单数组成。跟在字符或字符簇后面的花括号({})用来确定前面的内容的重复出现的次数。 //字符簇及其含义? 这些例子描述了花括号的三种不同的用法。一个数字,{x}的意思是“前面的字符或字符簇只出现x次”;一个数字加逗号,{x,}的意思是“前面的内容出现x或更多的次数”;两个用逗号分隔的数字,{x,y}表示“前面的内容至少出现x次,但不超过y次”。我们可以把模式扩展到更多的单词或数字: ^[a-zA-Z0-9_]{1,}$ //所有包含一个以上的字母、数字或下划线的字符串 ^[0-9]{1,}$ //所有的正数 ^-{0,1}[0-9]{1,}$ //所有的整数 ^-{0,1}[0-9]{0,}.{0,}$ //所有的小数 最后一个例子不太好理解,是吗?这么看吧:与所有以一个可选的负号(-{0,1})开头(^)、跟着0个或更多的数字([0-9]{0,})、和一个可选的小数点(.{0,1})再跟上0个或多个数字([0-9]{0,}),并且没有其他任何东西($)。下面你将知道能够使用的更为简单的方法。 特殊字符"?"与{0,1}是相等的,它们都代表着:“0个或1个前面的内容”或“前面的内容是可选的”。所以刚才的例子可以简化为: ^-?[0-9]{0,}.?[0-9]{0,}$ 特殊字符"*"与{0,}是相等的,它们都代表着“0个或多个前面的内容”。最后,字符"+"与 {1,}是相等的,表示“1个或多个前面的内容”,所以上面的4个例子可以写成: ^[a-zA-Z0-9_]+$ //所有包含一个以上的字母、数字或下划线的字符串 ^[0-9]+$ //所有的正数 ^-?[0-9]+$ //所有的整数 ^-?[0-9]*.?[0-9]*$ //所有的小数 当然这并不能从技术上降低正规表达式的复杂性,但可以使它们更容易阅读。 ? 匹配模式 贪婪模式? 最后需要特别指出的是,正则匹配默认是贪婪匹配,也就是匹配尽可能多的字符。举例如下,匹配出数字后面的 re.match(r‘^(d+)(0*)$‘,‘102300‘).groups()
(‘102300‘,‘‘)
由于 必须让 re.match(r‘^(d+?)(0*)$‘,‘102300‘).groups()
(‘1023‘,‘00‘)
三种匹配模式
? ? ? ? ? ? 想了解更多更详细关于正则匹配模式,可以参考文章:贪婪模式与非贪婪模式详解 ? 应用实例 判断功能 //*拿到号码 //*编写规则 //*判断是否符合规则 String phone="13831202155"; //判断功能 电话号码是否正确 String regex="1[3587][0-9]{9}"; boolean isTrueNumber=phone.matches(regex); 分隔功能 //*给定一个字符串 //*编写要分隔的规则(按某种规则分隔) //*分隔字符串供自己使用 public static void main(String[] args){ String str="我是一个小虫子,一个小星星鲁冰花啊"; //定义分隔规则 String regex=",|\"; String[] strs=str.split(regex); for (String string : strs) { System.out.println(string); } } 替换功能 //*定义一个要替换的字符串 //*定义替换规则 //*执行 public static void main(String[] args){ //把这个字符串里的非字母替换成字母j String s="jjkds28989309903290nms&……%##mkdskj909293。8 878&……!@~767jhdjku3928832oijdu3928"; String regex="[^a-zA-Z]";//如果不是字母,则全部替换成字母j String result=s.replaceAll(regex,"j"); System.out.println(result); } 获取功能 public static void main(String[] args){ String word="hello my darling,my ha a uiio jh jkjkj hy ew df cv jkkjds hgd"; //定义规则 b为单词边界 String regex="bw{2}b"; Pattern p=Pattern.compile(regex); Matcher m=p.matcher(word); while (m.find()) { System.out.println("符合规则的单词:"+m.group()); } } 判断功能在java中举例 public static void main(String[] args){ //使用Pattern和matchers类 //把这个字符串里的非字母替换成字母j String s="22222"; //把正则表达式编译成模式对象 Pattern p=Pattern.compile("[0-9]+"); //通过模式对象得到匹配器对象 Matcher m=p.matcher(s); //调用匹配器对象的功能 boolean isMatch=m.matches();//是否匹配 if (isMatch) { System.out.println("符合规则"); }else{ System.out.println("不符合规则"); } } ? 正则表达式很有用,不仅在程序中,就是搜索资料也可编写规则提高匹配度啊。理解正则表达式作用含义,学会常用正则表达式应用实例,是很有必要的啊! 正则表达式在线速查手册:速查手册 ? 参考资料: http://www.php100.com/manual/unze.html 廖雪峰老师blog (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |