前戏:

1.第一篇也不知道写点啥,感觉其他人都好高大上啊! 只好分享一点最近工作中用到的正则表达式---小括号,算是抛砖引玉吧!

2.正则表达式可以说是大部分编程语言通用的一项技术,虽然个别用法略微差异。

3.用好正则表达式不仅利于开发,就连平时使用文本编辑器,替换文本中的字符都比别人快一点。

 

正文:

  1. 单个字符匹配

对于要匹配单个字符,非常简单,直接在字符后加上限定符即可,

例如: a+ 表示匹配1个或一个以上的a,a?表示匹配0个或1个a。

这些限定符如下所示: 

X ?

X ,一次或一次也没有

X *

X ,零次或多次

X +

X ,一次或多次

X { n }

X ,恰好 n 次

X { n ,}

X ,至少 n 次

X { n , m }

X ,至少 n 次,但是不超过 m 次

  

  1. 多字符匹配(捕获分组 本篇的主角)

捕获分组可以通过从左到右计算其开括号来编号 。

例如:在表达式 ((A)(B(C))) 中,存在四个这样的组:

1    

((A)(B(C)))

2    

/A

3    

(B(C))

4    

(C)

组零始终代表整个表达式

之所以这样命名捕获分组是因为在匹配中,保存了与这些组匹配的输入序列的每个子序列。捕获的子序列稍后可以通过Back 引用 在表达式中使用,也可以在匹配操作完成后从匹配器检索。

   

 Back 引用 是说在后面的表达式中我们可以使用组的编号来引用前面的表达式所捕获到的文本序列(是文本不是正则) 。

   

 例如: ([" ']).* /1   其中使用了分组,/1就是对引号这个分组的引用,它匹配包含在两个引号或者两个单引号中的所有字符串,如,"abc" 或 " ' " 或 ' " '  ,但是请注意,它并不会对" a'或者 'a"匹配。原因上面已经说明,Back引用只是引用文本而不是表达式。

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\华丽的分割线\\\\\\\\\\\\\\\\\\\\\\\\\\

 

啰嗦这么多,下面简单粗暴直接上代码:

实例1:获取"@zhangsan 你好 @lisi 你好 @wangwu 你好"中@的用户名

 

Java:

String str = "@zhangsan 你好 @lisi 你好 @wangwu 你好";

// 结果将包换两个分组,@(\\w+\\s) 、(\\w+\\s)
Pattern p = Pattern.compile("@(\\w+\\s)");
Matcher m = p.matcher(str);
while(m.find()){

// 0和1代表分组索引,group()默认分组索引是0
System.out.println(m.group(0));

System.out.println(m.group(1));
}

 

JavaScript:

var str="@zhangsan 你好 @lisi 你好 @wangwu 你好";

var pattern = /@(\w+\s)/g;

while((result = pattern.exec(str)) != null)

{

         alert(result[1]);

}

实例2:将符合分组的文本,存储指定自定义索引。

Java:

String str = "@liurui 你好 @zhangiaofeng 你好 @linjie 你好";
Pattern p = Pattern.compile("@(?<ddd>\\w+\\s)");
Matcher m = p.matcher(str);
while(m.find()){
System.out.println(m.group("ddd"));
}

 

JavaScript:

很遗憾javaScript不支持自定义分组索引

 

 

ps:通过第二个实例也能看出来,正则表达式在各编程语言之间用法还是有一定差异的!

 

尾声:

我不是创造技术的,我只是个技术的搬运工。

posted on 2016-03-18 13:43  fatsnake  阅读(663)  评论(0编辑  收藏  举报