js正则表达式学习

//几种字符串操作:
var str = 'abcdef'; alert(str.search( 'b' ));      //弹出1;返回的是b在str中的位置;如果找不到返回-1; alert(str.substring(2,5));   //弹出cde;不包括结束位置; alert(str.substring(1));     //弹出bcdef,从开始位置一直截取到结束位置; alert(str.charAt(3));        //弹出d,返回的是第3个位置的字符;
var str =   '12 fff 87 er334 233 -=-=-=fa80' ;
alert(str.match(/\d+/g));     //返回字符串数组: 12 87 334 233 80

/*
正则表达式的两种风格
*/
var re =   new RegExp(  'a' ,  'i' );
var re = /a/i;
//找下面字符串中出现的第一个数字:
var str =   'asdf 23 23  zxcacxzczxc' ;
var re = /\d/;

console.log(str.search(re));          //5 找出第一个数字的位置

match用法:

//关于match:
//match: 把所有匹配的东西,全都提取出来;以数组的形式
var str =   'asdf 34 656 vsd33' ;
var re = /\d/;
var re2 = /\d/g;              //g global 找到全部
var re3 = /\d+/g;

alert(str.match(re));         //弹出3
alert(str.match(re2));        //弹出3,4,6,5,6,3,3   因为只告诉了计算机找一个数字
alert(str.match(re3));        //弹出34,656,33

 replace用法:

//把所有的a都替换成数字0
var str =   'abc aaa erw' ;
var re = /a/g;

alert(str.replace(  'a' ,   '0' ));    //弹出0bc aaa erw;
alert(str.replace(re,   '0' ));       //弹出0bc 000 erw;

replace小例子-敏感词过滤:

<body>
    <textarea id='txt1' cols="40" rows="5"></textarea><br>
    <input id="btn1" type="button" value="过滤"/><br>
    <textarea id='txt2' cols="40" rows="5"></textarea><br>
</body>

<script type="text/javascript">
//敏感词过滤
window.onload = function(){
    var oTxt1 = document.getElementById("txt1");
    var oTxt2 = document.getElementById("txt2");
    var oBtn = document.getElementById("btn1");

    oBtn.onclick=function(){
        var re = /北京|淘宝|百度/g;

        oTxt2.value = oTxt1.value.replace(re, '***');
    }
}
</script>

图:

方括号:

var str =   'apc fpc dpc xpc gpc rpc spc ppc' ;
var re = /[apx]pc/g;

alert(str.match(re));             //弹出apc xpc ppc

偷小说的小例子--过滤HTML标签

html标签规则:<除了<>外任意个字符>

 

图:

 

例1:校验电话号码:

如电话号码: 010-87496698-86:
区号和分机号都是可有可无的;电话开始一位不能是0,假设电话为8位数字;
假设分机号最多5位

(0\d{2,3}-)?[1-9]\d{7}(-\d{1,5})?
括号就是分组起来;

例2:校验邮箱:  

<body>
<input type="text" id='txt1'>
<input id="btn1" type="button" value="校验"></input>
</body>
<script type="text/javascript">
//校验邮箱:
window.onload=function(){
    var oTxt1 = document.getElementById("txt1");
    var oBtn = document.getElementById("btn1");
    oBtn.onclick=function(){
        //从字符串的开头和结尾,只能出现:\w+@[a-z0-9]+\.[a-z]+
        //整个字符串都会校验,而不仅仅是校验一部分
        var re = /^\w+@[a-z0-9]+\.[a-z]+$/i;

        //test方法:
        //检验oTxt1.value这个字符串是否符合正则re的规则,如果符合返回true
        //test 字符串一部分符合要求,true
        if(re.test(oTxt1.value)){
            alert("合法邮箱");
        }else{
            alert("非法邮箱");
        }
    }
}
</script>

量词:

量词:个数
+                  若干(多少都可以,最少1次),等同于{1,}
{n}                正好出现n次
{n, m}             最少n次,最多m次
(n,}               最少n次,最多不限
?                  可有可无,相当于{0, 1}
*                  0次或多次,相当于{0,}        (慎用,容易出问题,要考虑好)

方括号:

方括号
[abc]                a或b或c,任选一个即可 [abc]pc  则apc、bpc、cpc都行;
[a-z]                匹配a-z字母
[0-9]                匹配数字
[^a-z]               匹配除了a-z的字母外;
[^a-z0-9]            匹配除了英文字母和数字之外的东西

转义:

转义:
\d                匹配数字      [0-9]
.                 任意字符    (慎用,很容易出问题,用了.很可能是没考虑清楚)
\w                英文、数字、下划线  [a-z0-9_]
\s                空白字符 代表所有的空格,包含tab、回车、换行
\D                除了数字 [^0-9]
\W                除了英文数字下划线 [^a-z0-9_]
\S                除了空白字符

行首行尾:

行首行尾:
^                ^不出现在[]里面,代表行首--即字符串的开头
$                行尾,即字符串结尾;
 
js正则 贪婪的特性:
它会去匹配尽可能长的字符串,越长越好;

 

 

候选(也就是所说的“或”) 

re = /^a|bc$/;  //将匹配开始位置的a或结束位置的bc  
str =  "add" ;  
alert(re.test(str));  //true  
re = /^(a|bc)$/;  //将匹配a或bc  
str =  "bc" ;  
alert(re.test(str));  //true

  

js元字符    

( [ { \ ^ $ | ) ? * + .

元字符是正则表达式的一部分,当我们要匹配正则表达式本身时,必须对这些元字符转义

 

正向前瞻:   

在 JavaScript 中,正向前瞻(Positive Lookahead)是正则表达式中的一种高级特性,用于匹配某个模式,但不消耗字符。它的语法是 (?=...),其中 ... 是你希望匹配的模式。

正向前瞻的作用是:检查某个位置后面是否满足某个条件,但不会将匹配的内容包含在结果中。

例1:

//假设你想匹配后面跟着 bar 的 foo,但不希望 bar 包含在匹配结果中:
const str = "foobar foobaz";
const regex = /foo(?=bar)/g;
console.log(str.match(regex)); // 输出: ["foo"]

例2: 密码强度验证

假设你想验证密码是否满足以下条件:

  1. 至少包含一个数字。

  2. 至少包含一个小写字母。

  3. 至少包含一个大写字母。

  4. 长度至少为 8。

可以使用正向前瞻来实现:

const password = "Password123";
const regex = /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,}$/;

console.log(regex.test(password)); // 输出: true
  • (?=.*\d):正向前瞻,确保字符串中至少有一个数字。

  • (?=.*[a-z]):正向前瞻,确保字符串中至少有一个小写字母。

  • (?=.*[A-Z]):正向前瞻,确保字符串中至少有一个大写字母。

  • .{8,}:确保字符串长度至少为 8。

例3: 匹配特定格式的字符串

//假设你想匹配后面跟着 @ 符号的单词:
const str = "user@example.com admin@test.org";
const regex = /\w+(?=@)/g;

console.log(str.match(regex)); // 输出: ["user", "admin"]
  • \w+:匹配一个或多个字母、数字或下划线。

  • (?=@):确保匹配的内容后面跟着 @

  • 结果是 ["user", "admin"],因为 @ 后面的内容没有被包含。

 

正向前瞻 vs 捕获组

正向前瞻和捕获组的区别在于:

  • 正向前瞻:只检查条件,不消耗字符。

  • 捕获组:匹配并捕获内容。

例如:

const str = "foobar";
const lookaheadRegex = /foo(?=bar)/;
const captureRegex = /foo(bar)/;

console.log(lookaheadRegex.exec(str)); // 输出: ["foo"]
console.log(captureRegex.exec(str));   // 输出: ["foobar", "bar"]
  • 正向前瞻只匹配 foo,而捕获组匹配 foobar 并捕获 bar

 

负向前瞻:

在 JavaScript 中,负向前瞻(Negative Lookahead)是正则表达式中的一种高级特性,用于匹配某个模式,但确保该模式后面不跟随特定的内容。它的语法是 (?!...),其中 ... 是你不希望匹配的模式。

负向前瞻的作用是:检查某个位置后面是否不满足某个条件,但不会将匹配的内容包含在结果中。

示例 1:匹配后面不跟着特定字符的字符串

假设你想匹配后面不跟着 bar 的 foo

const str = "foobar foobaz";
const regex = /foo(?!bar)/g;

console.log(str.match(regex)); // 输出: ["foo"]
  • foo(?!bar):匹配 foo,但要求 foo 后面不能跟着 bar

  • 结果是 ["foo"],因为 foobar 中的 foo 被排除了。

 

示例 2:排除特定格式的字符串

假设你想匹配不以 .jpg 结尾的文件名:

const filenames = ["image.png", "photo.jpg", "document.pdf"];
const regex = /^(?!.*\.jpg$).*/;

const validFiles = filenames.filter(filename => regex.test(filename));
console.log(validFiles); // 输出: ["image.png", "document.pdf"]
  • ^(?!.*\.jpg$):负向前瞻,确保字符串不以 .jpg 结尾。

  • .*:匹配任意字符。

  • 结果是 ["image.png", "document.pdf"],因为 photo.jpg 被排除了。

 

示例 3:密码强度验证

假设你想验证密码是否满足以下条件:

  1. 不能包含 password

  2. 长度至少为 8。

可以使用负向前瞻来实现:

const password = "secure123";
const regex = /^(?!.*password).{8,}$/;

console.log(regex.test(password)); // 输出: true
  • ^(?!.*password):负向前瞻,确保字符串中不包含 password

  • .{8,}:确保字符串长度至少为 8。

 

示例 4:匹配特定分隔符之前的内容

假设你想匹配逗号分隔的数字,但排除后面跟着 00 的数字:

const str = "123,456,78900,101";
const regex = /\d+(?!00)(?=,|$)/g;

console.log(str.match(regex)); // 输出: ["123", "456", "101"]
  • \d+:匹配一个或多个数字。

  • (?!00):确保匹配的内容后面不跟着 00

  • (?=,|$):确保匹配的内容后面跟着逗号或字符串结尾。

  • 结果是 ["123", "456", "101"],因为 78900 被排除了。

 

负向前瞻 vs 正向前瞻

  • 正向前瞻(?=...),确保后面满足某个条件。

  • 负向前瞻(?!...),确保后面不满足某个条件。

const str = "foobar foobaz";
const positiveLookahead = /foo(?=bar)/g;
const negativeLookahead = /foo(?!bar)/g;

console.log(str.match(positiveLookahead)); // 输出: ["foo"]
console.log(str.match(negativeLookahead)); // 输出: ["foo"]
  • 正向前瞻匹配 foobar 中的 foo

  • 负向前瞻匹配 foobaz 中的 foo

 

 

 

--

posted on 2017-01-04 22:22  有点懒惰的大青年  阅读(219)  评论(0)    收藏  举报