JStask7 正則表達(dá)式

題目1: \d,\w,\s,[a-zA-Z0-9],\b,.,*,+,?,x{3},^,$分別是什么?

正則簡介

題目2:寫一個(gè)函數(shù)trim(str),去除字符串所有的空白字符

function trim(str){
  var reg = /\s/g
  var newStr = str.replace(reg,"")
  return newStr
}
var a = "        1  2    4  "
console.log(trim(a))  //"124"

### 題目2.1:寫一個(gè)函數(shù)trim(str),去除字符串兩邊的空白字符

function trim(str){
  var reg = /^\s+|\s+$/g
  var newStr = str.replace(reg,"")
  return newStr
}
var a = "        1  2    4  "
console.log(trim(a))  //"1  2    4"

題目3: 寫一個(gè)函數(shù)isEmail(str),判斷用戶輸入的是不是郵箱

//判斷郵箱
function isEmail(str){
  if(!/(\w{8,})@[a-z0-9]{2,3}\.com$/.test(str)){
        console.log("我不是郵箱")
  }else{
    console.log("歡迎使用")
  }
}
isEmail("1614527443@qq.com")

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>JS Bin</title>
</head>
<body>
<label>郵箱:</label><input type="text" onblur="checkNetEase(this)" onfocus="reset(this)" placeholder="郵箱">
<script>
    function checkNetEase(mobileInput){
        var value = mobileInput.value;
        /*我對(duì)郵箱的規(guī)則不是太清楚
         *用戶名至少8位吧
         *@后面觀察qq,網(wǎng)易等,不超過3個(gè)字符
         *以.com結(jié)尾
         */
        if(!/(\w{8,})@[a-z0-9]{2,3}\.com$/.test(value)){
            mobileInput.style.borderColor = 'red';
        }
    }

    function reset(mobileInput){
        mobileInput.style.borderColor = '';
    }
</script>
</body>
</html>

題目4: 寫一個(gè)函數(shù)isPhoneNum(str),判斷用戶輸入的是不是手機(jī)號(hào)

//判斷手機(jī)號(hào)
function isPhoneNum(str){
   if(!/^1\d{10}$/.test(str)){
       console.log("不好意思,請(qǐng)您重新輸入手機(jī)號(hào)")
   }else{
     console.log("OK")
   }
}
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>JS Bin</title>
</head>
<body>
  <input type="text" id="mobile" onblur="check(this)" onfocus="reset(this)">
  <script>
      function check(mobileInput){
          var value = mobileInput.value;
          //手機(jī)第一位是1,后面有十位數(shù)字
          if(!/^1\d{10}$/.test(value)){
              mobileInput.style.borderColor = 'red';
          }
      }

      function reset(mobileInput){
          mobileInput.style.borderColor = '';
      }
  </script>
</body>
</html>

題目5: 寫一個(gè)函數(shù)isValidUsername(str),判斷用戶輸入的是不是合法的用戶名(長度6-20個(gè)字符,只能包括字母、數(shù)字、下劃線)

function isValidUsername(str){
  if(/^\w{6,20}$/.test(str)){
    console.log("我是合法的用戶名")
  }else{
    console.log("我不是合法的")
  }
}
isValidUsername("str1234")

題目6: 什么是貪婪模式和非貪婪模式

參考博客

貪婪模式

  • 默認(rèn)情況下,?, +, *, {min,}, {min, max}都是貪婪的。

先看一個(gè)正則:

var str = 'a "witch" and her "broom" is one';
str.match( /".*"/g);  //[""witch" and her "broom""]

結(jié)果匹配的不是["witch"],也不是["broom"],而是[""witch" and her "broom""]

我們來看一下正則

  1. 第一個(gè)字符是",所以正則匹配到第一個(gè)"
  2. .(點(diǎn)號(hào))*(星號(hào))點(diǎn)號(hào)代表任意字符星號(hào)代表任意字符重復(fù)一次到多次,沒有遇到點(diǎn)號(hào)不能匹配的字符,所以一直到最后
  3. 文本結(jié)束后,點(diǎn)的匹配停止了,但仍然有剩余的的正則需要匹配,即:"因此,正則引擎開始倒過來回溯,換句話說,就是一個(gè)字符一個(gè)字符縮減匹配。
  4. 一直字符縮減到匹配到"
  5. 所以結(jié)果是[""witch" and her "broom""]

總結(jié):在貪婪(默認(rèn))模式下,正則引擎盡可能多的重復(fù)匹配字符

非貪婪模式

  • 非貪婪模式和貪婪模式相反,可通過在代表數(shù)量的標(biāo)示符后放置?來開啟非貪婪模式,如?、+?甚至是??
上一個(gè)例子
var str = 'a "witch" and her "broom" is one';
str.match(/".*?"/g )  // [""witch"", ""broom""]

驚不驚喜意不意外?結(jié)果竟然不一樣

我們繼續(xù)看一下正則

  • 看看非貪婪模式.?是怎么運(yùn)轉(zhuǎn)的。
  1. 第一個(gè)字符是",所以正則匹配到第一個(gè)"
  2. 第二步一樣, .被匹配上
  3. 第三步區(qū)別來了,正則引擎嘗試用最小可能的重復(fù)次數(shù)來進(jìn)行匹配,因此在.匹配了w后,它立即嘗試"的匹配
  4. .重復(fù)更多的字符,再進(jìn)行嘗試.
  5. 匹配,終于匹配到"witch"
  6. 因?yàn)檎齽t是global的,所以正則引擎繼續(xù)后面的匹配,從引號(hào)后面的a字符開始。后面有匹配到第二個(gè)字符串"broom"

總結(jié):在非貪婪模式下,正則引擎盡可能少的重復(fù)匹配字符

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容