[正则表达式]常用正则表达式实例
1、选中被逗号(或其他符号)分割的字符串当中的某一个值
69,23,69,88,695,69,69,6,765769fd969690,3242,969,69
实例,选中以上字符串所有出现的69部分
(\b69\b[,]?)|([,]?\b69\b)
javascript
var val = "69"; var exp = new RegExp("(\\b"+val+"\\b[,]?)|([,]?\\b"+val+"\\b)","g");
php
$matches = array(); $search = '69,23,69,88,695,69,69,6,765769fd969690,3242,969,69'; $target = '69'; $pattern = '/(\b'.$target.'\b[,]?)|([,]?\b'.$target.'\b)/'; preg_match_all ($pattern, $search, $matches);
2、运用环视功能为数字描点
569836495
实例,从数字的第1位起,每三位插入逗号以区分数位
(?<=\d)(?=(?:[\d]{3})+\b)
javascript,由于javascript只支持顺序环视,所以写法会跟其他语言有些区别
var subject = "569836495"; var exp = /(\d)(?=(\d{3})+(?!\d))/g; subject.replace(exp, "$1,");
php
$subject = '569836495'; $target = ','; $pattern = '/(?<=\d)(?=(?:[\d]{3})+\b)/'; preg_replace($pattern, $target, $subject);
3.匹配引号当中的内容,内容包含转义引号
"([^"]|(?<=\\)")*"
但是它不支持引号内包含\\"这种形式的字符,因为第一个\是为了转义第二个\,而"事实上是边界来的,但是被上面的表达式识别成了第二个\是为了转义"
并且有很多引擎(如javascript)不支持逆序环视,好在用顺序环视也是可以表达出来的,只不过在写法上会复杂一些:
"([^"\\]|((?=\\\\)[\\][\\]|(?=\\[^"])[\\]|(?=\\")[\\]["]))*"
此表达式由"号开始然后匹配正文,正文允许0到n个匹配,最后以"结束
正文匹配分两部分:
第一部分当遇到不是"和\字符则直接匹配;
第二部分当遇到"和\字符时,符合子表达式(?=\\\\)[\\][\\]|(?=\\[^"])[\\]|(?=\\")[\\]["]才匹配;
子表达式很简单:
(?=\\\\)[\\][\\]:如果是连续两个\\则匹配;
(?=\\[^"])[\\]:如果是一个\,并且后接字符不是"则匹配;
(?=\\")[\\]["]:如果是\"则匹配;
这个表达式只适合NFA引擎,由于NFA引擎的工作原理,匹配是优先的,只有后面还有匹配规则,并且这个规则匹配不上的时候,前面的匹配才会把结果吐出来进行尝试回溯,
所以子表达式当中(?=\\\\)[\\][\\]必须要在(?=\\[^"])[\\]前面,动动脑子想想为什么吧;
4.去除字符串前后字符(trim)
^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$
这个其实很容易理解,起始位接\s+,或者\s+接结束位都会被匹配;