总结下正则表达式

常 用 匹 配 符

^   匹配起始位置或每行开始,或是否定如[^a]表示除a之外的    
$   匹配结束位置或每行结束 
.   匹配除了换行符以外的任何字符  
[]  匹配包含括号内元素的字符    [ab]等价(a|b),在方括号中,不需要转义字符如[']匹配一个单引号
\b  匹配一个位置,不会消耗任何字符,常用于匹配单词边界   
\d  匹配数字    
\w  匹配字母,数字,下划线 
\s  匹配空格,制表符等空白符    等价于 \f\n\r\t\v
[^abc]  匹配除了abc以外的任意字符  
\B  表示与小写相反 
\D  表示与小写相反 
\W  表示与小写相反 
\S  表示与小写相反 

量 词

{}  表示前导对象的数量   {n} 重复n次,{n,m}重复n到m次{n,}大于等于n
?   表示1个或0个 <==>{0,1}   +?,*?,??,C19{}?表示在遇到下一个匹配符之前尽可能多的匹配
+   表示1个或n个 <==>{1,}    
*   表示0个或n个 <==>{0,}   

捕 获分组与预查

 (pattern)       	匹配pattern,并捕获文本到自动命名的组里,    js和java中可以使用$0-$9取出匹配的字符,如aa1 ,([a-z])\1可以匹配到aa,\1是对括号中匹配到的字符的引用
 (?<name>pattern)   匹配pattern,并捕获文本到名称为name的组里 如:(?<aaa>[a-z])\k<aaa>可以匹配到aa,\k<aaa>是对括号中匹配到的字符的引用,捕获分组的名称是aaa
 (?:exp)      		匹配exp,不捕获匹配的文本,也不给此分组分配组号 匹配的内容与(exp)一样,一般用于“industr(?:y|ies)”等价于“industry|industries”
 (?=exp)      		匹配exp前面的位置    如  How are you doing  正则 (?<txt>.+(?=ing))  这里取ing前所有的字符,并定义了一个捕获分组名字为  txt  而 txt 这个组里的值为 How are you do ;
 (?<=exp)           匹配exp后面的位置    如  How are you doing  正则 (?<txt>(?<=How).+)  这里取 How 之后所有的字符,并定义了一个捕获分组名字为  txt  而 txt 这个组里的值为  are you doing ;
(?<!exp)           匹配前面不是exp的位置    如 “(?<=95|98|NT|2000)Windows”能匹配“2000Windows”中的“Windows”,但不能匹配“3.1Windows”中的“Windows”
 (?!exp)            匹配后面跟的不是exp的位置     如  123abc  正则  \d{3}(?!\d) 匹配3位数字后非数字的结果

不常用匹配符

    \xn         匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,'\x41' 匹配 "A"。'\x041' 则等价于 '\x04' & "1"。正则表达式中可以使用 ASCII 编码。.  
    \num        匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,'(.)\1' 匹配两个连续的相同字符。 
    \n  		标识一个八进制转义值或一个向后引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为向后引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。   
    \un         匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如, \u00A9 匹配版权符号 (?)。 
    \nm         标识一个八进制转义值或一个向后引用。如果 \nm 之前至少有 nm 个获得子表达式,则 nm 为向后引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的向后引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm。   
    \nml        如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。
    \cx         匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。 
    \t          匹配一个制表符。等价于 \x09 和 \cI。     
    \v          匹配一个垂直制表符。等价于 \x0b 和 \cK。   
    \f          匹配一个换页符。等价于 \x0c 和 \cL。

在这里插入图片描述

PHP的正则表达式有一些内置的通用字符簇,如下:

[[:alpha:]]  任何字母     
[[:digit:]]  任何数字 
[[:alnum:]]  任何字母和数字 
[[:space:]]  任何白字符 
[[:upper:]]  任何大写字母 
[[:lower:]]  任何小写字母 
[[:punct:]]  任何标点符号 
[[:xdigit:]] 任何16进制的数字,相当于[0-9a-fA-F] 

各种操作符的运算优先级

相同优先级的从左到右进行运算,不同优先级的运算先高后低。各种操作符的优先级从高到低如下:  
操作符		                    	描述 
\                 					转义符 
(), (?:), (?=), []  				圆括号和方括号 
*, +, ?, {n}, {n,}, {n,m}  			限定符 
^, $, \anymetacharacter  			位置和顺序 【 anymetacharacter  	表示任何元字符】
|  									“或”操作 

JavaScript中使用正则表达式

支持正则表达式的 String 对象的方法

  • 使用search()

      用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串。
      如果没有找到任何匹配的子串,则返回 -1。如果找到返回首次找到的位置
      
      var str = "Visit w3cschool"; 
      var n = str.search(/w3cschool/i);
      console.log(n);
      
      输出结果:6
      i为修饰符,对应单词 ignore ,表示忽略大小写
    
  • 使用match()

      查找字符串是否匹配给定的匹配模式,如过匹配到返回一个数组(包含匹配到的字符串等信息),
      否则返回null,其中的参数匹配模式中如果包含g则匹配所有的匹配串,否则返回首次匹配到的结果及位置信息。
      (ps:匹配模式中的m即多行匹配,会对多行进行匹配,但在全部字符串中遇到第一个匹配后不再继续匹配)
      
      var str="a123ccad"; 
      var n=str.match(/[a][a-z-1-9]/);//与var n=str.match(/[a][a-z-1-9]/m);
      console.log(n)
      输出结果: ["a1", index: 0, input: "a123ccad", groups: undefined]   
      
      var str="a123ccad"; 
      var n=str.match(/[a][a-z-1-9]/g);
      console.log(n)
      输出结果: ["a1", "ad"]
    
  • 使用split()

      语法 :string.split(separator,limit)  用于把一个字符串分割成字符串数组,返回一个数组。
      separator 可选。字符串或正则表达式。
      limit 可选。该参数可指定返回的数组的最大长度。
      
      var str="How are you doing today?";
      var n=str.split(" ",3);
      console.log(n)
      返回结果:["How", "are", "you"]
      var str="How are you doing today?";
      var n=str.split();
      console.log(n)
      返回结果:["How are you doing today?"]
      
      (ps:如果把空字符串 ("") 用作 separator,那么 stringObject 中的每个字符之间都会被分割。
      split() 方法不改变原始字符串。)
    
  • 使用replace()

      var str = "Visit Microsoft!\nVisit Microsoft!"; 
      var res = str.replace(/microsoft/gi, "w3cschool");
      console.log(res);
      输出结果:Visit w3cschool!
      (ps:gi 为修饰符,g表示全局匹配(查找所有匹配而非在找到第一个匹配后停止),即global,i表示忽略大小写)
    
      var str = "Visit Microsoft!\nVisit Microsoft!"; 
      var res = str.replace(/mic(r)osoft/gi, "w3cschool"+RegExp.$1);
      console.log(res);
      输出结果:Visit w3cschooli!
     (ps: 其中RegExp.$1代表匹配模式中小括号内匹配到的值,$1~$9分别代表第一到第九个分组内的值)
    

RegExp 对象

  • 生成RegExp对象

      var  patt = /microsoft/gi;  
      var  patt = new RegExp("e"); //var  patt = /e/;
      var  patt = new RegExp(pattern,modifiers);  //var pattern  = new RegExp('microsoft','gi');
      使用RegExP对象之后可以使用RegExP.$1去第一个分组内的值,1-9一次类推。
    
  • test()方法

      搜索字符串指定的值,根据结果并返回真或假。
      
      var str = "Visit Microsoft!\nVisit Microsoft!"; 
      var  patt = /microsoft/gi; //
      console.log(patt.test(str));
      
      输出结果:true
    
  • exec() 方法

      检索字符串中的指定值。返回值是被找到的值。如果没有发现匹配,则返回 null。
      
      var patt1=new RegExp("e");
      console.log(patt1.exec("The best things in life are free"));
      输出结果:e
      var patt = new RegExp("RUNOOB", "g");
      var res = patt.toString();
      console.log(res );  
      输出结果:/RUNOOB/g
    

Java中使用正则表达式

  • 查找

      import java.util.regex.Matcher;
      import java.util.regex.Pattern;
      public class RegexTest {
      
      	public static void main(String[] args) {
      		    String regexEmotion = "([1-9][0-9]{3})[^1-9]*?([1][0-2]|[0]?[1-9])[^1-9]*?([3][01]|[1-2][0-9]|[0]?[1-9])";
             Pattern patternEmotion = Pattern.compile(regexEmotion);
             String spannableString = "fjkashfjaj jsd 计划书2019  -0131";
             Matcher matcherEmotion = patternEmotion.matcher(spannableString);
             while (matcherEmotion.find()) {
             	System.out.println(matcherEmotion.group(1)+ matcherEmotion.group(2) + matcherEmotion.group(3));
             }
         }
      }
      输出:20190131
    
  • 替换

      import java.util.regex.Matcher;
      import java.util.regex.Pattern;
      public class RegexTest {
    		public static void main(String[] args) {
       		    String regexEmotion = "([0-9]{4})(-)";
              Pattern patternEmotion = Pattern.compile(regexEmotion);
              String spannableString = "0131-";
              Matcher matcherEmotion = patternEmotion.matcher(spannableString);
              if(matcherEmotion.find()){
      					spannableString = spannableString.replaceAll(regexEmotion,"$1"+"$2"+"$1");
      					System.out.println(spannableString);
      				}
      	}
      }	
    输出:0131-0131
    
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值