正則

正則

正則是什麼

正則是處理字符串的一種規則 JS中的正則具體體現出來是一種數據類型 RegExp ,是一種引用數據類型數據javascript

JS編寫正則的兩種方式

  1. 字面量的實例形式:
var reg = /q/
複製代碼
  1. new 的方式建立

涉及到變量時候會偶爾用new的方式建立正則,通常都是字面量的方式java

var reg = new RegExp('q')
複製代碼

正則通常有兩種用途

  • 用於匹配 test
    • 編寫一個正則,看對應的字符串是否符合該正則
  • 用於捕獲 exec
    • 編寫一個正則,能夠把對應字符串中的符合規則的部分獲取到

正則的組成結構

正則雙斜槓中的內容 咱們稱爲元字符,斜槓外邊的內容咱們稱爲修飾符 經常使用的元字符能夠分爲 有特殊含義的元字符量次元字符 普通元字符數組

元字符

有特殊含義的元字符
  • \ :轉義
  • \d :0~9之間的數字
  • \D:除0~9之外的字符
  • \w :表明數字 字母 下劃線
  • \W :除數字 字母 下劃線之外的字符
  • ^:表明以什麼字符開頭
  • $:表明以什麼字符結尾
  • . :表明 除了換行符之外的全部的字符
  • \n :換行符
  • x|y :字符x 或者字符y(x和y能夠是多個字符)
  • [ab] :表明字符a或者字符b(a和b只能是單個字符)
  • [^ab] : 表明非a b
  • [a-z] :表明a-z之間任意字符 小寫字母
  • [^a-z] :表明除了小寫字母
  • () :分組和提高優先級
  • (?:) :非捕獲匹配
  • (?=)
  • (?!)
量詞元字符
  • ? :前邊的字符出現了 0 或者 1 次
  • +: 前邊的字符出現了 1 或者 屢次
  • * : 表明的字符出現了 0 或者屢次
  • {n} :前邊的字符出現了至少連續的n次
  • {n,m}: 前邊的字符出現了n 到 m 次
  • {n,} : 前邊的字符出現了 n 到屢次
修飾符
  • i :忽略大小寫 ignoreCase
  • m : 多行匹配 mutiline
  • g : 全局匹配 global
var str = '2019-9-23';
    // str = str.replace(/-/g, '/');
    console.log(str.replace(/-/g,'/'));
    var ary = ['qqq', 'www', 'yyy'];
    var arr = ary.map(item => new RegExp(item)) ;
    console.log(arr);
複製代碼

正則匹配

寫一個正則 去匹配字符串,字符串中有符合正則 的字符就返回true,不然就返回falsebash

<script>
    var reg = /d/;//匹配字符串中的d 
    console.log(reg.test('nnj07vgh'));//false
    console.log(reg.test('ndjjkjk'));//true

    var reg = /\d/;
    console.log(reg.test('jjsjkj'));//false
    console.log(reg.test('9bbjh'));//true

    var reg = /\d{2}/;//至少出現連續的兩個數字
    console.log(reg.test('9'));
    console.log(reg.test('99'));
    console.log(reg.test('jknk0bhj'));
    console.log(reg.test('jknk0865bhj'));
    
    var reg = /\\d/;//第一個\表明轉義把第二個\轉成了不具備轉義意義的字符\ 正則的意思就是匹配字符\d
    console.log(reg.test('99h'));//f
    console.log(reg.test('bhj\ddd98yv'));//f
    console.log(reg.test('\\d'));//t

    var reg = /^\d.123$///以數字開頭以3結尾 3前邊是個12 12前邊是一個除了換行符之外的任意字符
    console.log(reg.test('8\n123'));
    console.log(reg.test('8.123'));
    console.log(reg.test('8n123'));
    
    var reg = /^\d\.123$/;//. 再也不表明正則中除了換行符之外的任何 而是隻表明一個普通字符.  此正則表明以任意數字開頭 以3結尾 中間是.12
    console.log(reg.test('3.123'));
    console.log(reg.test('5n123'));

var reg = /[a-c]/; //  只要有一個 a或者b或者c ; 結果就是true
console.log(reg.test('aqweaqe'))
var reg = /^[a-c]/; //  只要以 a或者b或者c  開頭的字符串; 結果就是true
var reg = /^[a-c]{2}/; //  只要以 a到c之間的任意兩個字符開頭的字符串 結果都是true;

var reg = /[a-z0-9]/; // 小寫字母和數字
var reg = /[0-9a-z]/;// 小寫字母和數字
var reg = /[0-9a-zA-Z_]/; // \w

var reg = /[.]/ // 中括號中的點 表明 點 自己;
var reg = /^18|19/;//以18開頭 或者有19;或的優先級高
var reg = /18|19$/;//含有18 或以19結尾
var reg = /^18|19$/;//以18開頭  或以19結尾
var reg = /^(18|19)$/;//18   19/^1[89]$/
</script>
複製代碼

正則匹配

  • 匹配有效數字

有效數字:能夠有正負號,能夠有小數部分,整數部分不能以0開頭函數

var reg = /^[-+]?([1-9]\d|\d+)(\.\d+)?$/
複製代碼
  • 身份證

前邊6位行政區號 4位年份2位月份2位天,最後一位多是隨意數字 也多是Xui

let reg=/^\d{6}(\d{4})(\d{2})(\d{2})\d{2}(\d)(\d|X)$/;\d[\d|X]/
複製代碼

正則捕獲

reg .exec(str) :從字符串中獲取 知足正則的字符spa

var reg = /\d+/;
var str = 'hello2019hello2020';
console.log(reg.exec(str));
複製代碼

exec 捕獲結果 :exec的返回結果是一個數組 第一項是大正則捕獲的內容,第二項及之後是小分組捕獲到的內容 第二項式第一個小分組; 第三項是第二個小分組 若字符串中沒有任何符合正則的內容 ,則獲取到的內容就是一個nullcode

var reg = /([a-z]+)(\d+)/
var str = 'hello2019hello2020';
console.log(reg.exec(str))
複製代碼

正則的貪婪性

一次性會把全部知足正則的字符都捕獲到 解決正則的貪婪性:加?regexp

var reg = /\d+?/;
var str = 'hello2019hello2020';
console.log(reg.exec(str));
複製代碼

正則的懶惰性

只捕獲一次,再也不不厚其餘符合正則的字符 經過添加全局修飾符g 解決;索引

每個正則都有一個lastIndex屬性,不加全局修飾符g 的時候,lastIndex 的 值是0;加了g以後,每次匹配或者捕獲都會更新lastIndex值,下一次捕獲的lastIndex是 上一次捕獲結束的位置

加上g以後,每次捕獲時都會更新lastIndex 屬性 lastIndex屬性控制的是下一次開始匹配的起始索引 test 和 exec都會更新lastIndex屬性

var reg  =/([a-z]+)(\d+)/g;
var str = 'bye2019hello2020';
console.log(reg.exec(str));
console.log(reg.exec(str));
複製代碼

字符串的match方法

match方法是配合正則使用,用於捕獲符合正則的字符

var reg = /([a-z]+)(\d+)/
    var str = 'ff2019ff2020';
    console.log(reg.exec(str));
    console.log(str.match(reg));
複製代碼

在不加全局修飾符g的時候,match和exec捕獲到的內容一致

var reg = /([a-z]+)(\d+)/g;
    var str = 'zf2019zf2020';
    console.log(reg.exec(str));
    console.log(str.match(reg));
複製代碼

正則加了全局修飾符g ,用match方法去捕獲字符串的時候,只捕獲大正則到的內容,會忽略小分組的內容

字符串的split方法

split方法能夠把字符串轉成數組,用法:用括號中的參數去切割字符串,把分割的兩部分放到數組中,能夠配合正則使用

var str = '2019-09-30';
var res = str.split(/\-/g);
console.log(res);//=>['2019','09','30']
複製代碼

字符串的replace方法

replace 方法是把字符串的xxx換成xxx2。replace方法有兩個參數,第一個參數能夠是字符、正則,第二個參數能夠是字符或者回調函數

replace中的回調函數的實參結果跟match 和exec 方法獲取到的內容相似,返回的字符串是由匹配到的內容被return值 替換以後的新字符串,回調函數的執行次數跟正則匹配到的次數一致,有多少個知足的就會執行幾回

var str = '2019ff2020jy09';
var res = str.replace(/(\d+)([a-z]+)/g,function(){
	console.log(arguments);
})
複製代碼
var str = '1+2+3+4+5';
var res = str.replace(/\+/g,function(){
	return =;
});
console.log(res);//=>'1=2=3=4=5'
複製代碼
var str = 'wer2312gsgsd345sdfgs345qwe324'
var res = str.replace(/([a-z]+)(\d+)/g,'$1===$2===').replace(/=+$/,'');
// $1  $2  $3 ... 分別表明第一個小分組第二個小分組;
console.log(res)
複製代碼
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息