課前補充
- 轉義字元 ‘’
把 \ 後面的字元轉成正常文本
\r :行結束
\n :換行
\t :制表符
- 多行字元串
字元串不能換行寫
var test = '\
<div></div>\
<span></span>\
';
把文本形式的回車轉義掉,多行字元串可以實作
- 字元串換行符 \n
RegExp 正規表達式
什麼是正規表達式?
正規表達式是構成搜尋模式(search pattern)的字元序列。
當您搜尋文本中的資料時,您可使用搜尋模式來描述您搜尋的内容。
正規表達式可以是單字元,或者更複雜的模式。
正規表達式可用于執行所有類型的文本搜尋和文本替換操作。
正規表達式的作用:比對特殊字元或有特殊搭配原則的字元的最佳選擇。
建立方式
- 字面量
var reg = /abc/;
正規表達式abc :有一個比對字元串的規則叫abc
比對規則:包含abc字元片段(必須是abc,不能大小寫,不能分隔開
var reg = /abc/;
var str = 'abcd';
reg.test(str); // 測驗字元串str是否含有規定片段(abc字元片段)
// true
i :ignoreCase 忽視大小寫
g : global 全局比對(查找所有比對而非在找到第一個比對後停止)
m : 多行比對
- new RegExp();
// var reg = new RegExp('規則','屬性');
var reg = new RegExp('abc','i');
var str = 'abcd';
reg.test(str);
var reg1 = /abc/;
var reg = new RegExp(reg1);
// 樣子一樣但是彼此獨立
var reg = RegExp(reg1);
// 本質同一個正規表達式,隻不過是不同引用,兩個鑰匙指向同一個房間
修飾符 / 屬性
// i :ignoreCase 忽視大小寫
var reg1 = /abc/;
var reg2 = /abc/i;
var str1 = 'aBcde';
console.log(reg1.test(str1)); // false
console.log(reg2.test(str1)); // true
// g : global 全局比對(查找所有比對而非在找到第一個比對後停止)
var reg11 = /ab/;
var reg22 = /ab/g;
var str2 = 'ababababab';
console.log(str2.match(reg11)); // ["ab"]
console.log(str2.match(reg22)); // ["ab", "ab", "ab", "ab", "ab"]
// m : 多行比對
var reg111 = /^a/g; // ^a :開頭的a
var reg222 = /^a/gm;
var str3 = 'abcd\na'; //多行字元串,不是寫起來多行
console.log(str3.match(reg111)); // ["a"]
console.log(str3.match(reg222)); // ["a", "a"]
方括号
方括号用于查找某個範圍内的字元:
表達式 描述
[abc] 查找方括号之間的 任何字元。
[^abc] 查找任何 不在 方括号之間的字元。
[0-9] 查找任何從 0至9 的數字。
[a-z] 查找任何從 小寫a到小寫z 的字元。
[A-Z] 查找任何從 大寫A到大寫Z 的字元。
[A-z] 查找任何從 大寫A到小寫z 的字元。
[adgk] 查找給定集合 内 的任何字元。
[^adgk] 查找給定集合 外 的任何字元。
(red|blue|green) 查找任何指定的選項。
const reg = /[1234567890][1234567890][1234567890]/g; // 一個方括号代表一位,裡面是區間,該表達式為取三個數字連在一起的片段
const str = '12334fgsfj5465hgjf'; // 三位一看,不會翻過去 例如1234ui 其中符合比對規則的有:123
console.log(str.match(reg)); // ["123", "546"]
const reg2 = /[ab][cd][d]/g;
const str2 = 'abcd';
console.log(str2.match(reg2)); // ["bcd"]
const reg3 = /(abc|bcd)[0-9]/g;
const str3 = 'bcd8';
console.log(str3.match(reg3)); // ["bcd8"]
元字元
元字元(Metacharacter)是擁有特殊含義的字元:
元字元 描述
. 查找單個字元,除了換行和行結束符。
\w 查找單詞字元。
\W 查找非單詞字元。
\d 查找數字。
\D 查找非數字字元。
\s 查找空白字元。
\S 查找非空白字元。
\b 比對單詞邊界。
\B 比對非單詞邊界。
\0 查找 NUL字元。
\n 查找換行符。
\f 查找換頁符。
\r 查找回車符。
\t 查找制表符。
\v 查找垂直制表符。
\xxx 查找以八進制數xxx規定的字元。
\xdd 查找以十六進制數dd規定的字元。
\uxxxx 查找以十六進制數xxxx規定的 Unicode字元。
\w === [0-9A-z_] : 取0-9,A-z,_ 區間的數
\W === [^\w] : 非\w
\d === [0-9]
\D === [^\d]
\s : 空白字元【空格符、制表符、回車符、換行符、垂直換行符、換頁符】
\s === [ \t\r\n\v\f] 在正規表達式裡寫空格就表示比對一個空格
\S === [^\s]
\b === 單詞邊界
\B === 非單詞邊界
const reg = /\bcde\b/g;
const str = 'abc cde efg';
console.log(str.match(reg)); // null
const reg = /\bcde\B/g;
const str = 'abc cdeefg';
console.log(str.match(reg)); // ["cde"]
\t : 不是視覺上的\t,而是真是的文本\t
Unicode字元:十六進制,最多16層,不同層包含資訊不同,可以表示漢字
\u010000 - \u01ffff 第一層
\u020000 - \u02ffff 第二層
…
\u100000 - \u10ffff 第十六層
第一層可以省去01,直接寫為 \u0000 - \uffff
其他層要寫層數
const reg = /\u65e9\u4e0a\u597d/g;
// reg = /[\u0000-\ua000]/g;
const str = '早上好';
reg.test(str); // true
console.log(str.match(reg)); // ["早上好"]
能比對所有
[\s\S]
集合并上補集
. === [^\r\n]
量詞
量詞:表示數量的詞,幾個,一把
量詞 描述
n+ 比對任何包含 至少一個 n 的字元串。
n* 比對任何包含 零個或多個 n 的字元串。
n? 比對任何包含 零個或一個 n 的字元串。
n{X} 比對包含 X個n 的序列的字元串。
n{X,Y} 比對包含 X至Y個n 的序列的字元串。
n{X, } 比對包含至少 X個n 的序列的字元串。
n$ 比對任何 結尾為n 的字元串。
^n 比對任何 開頭為n 的字元串。
?=n 比對任何 其後緊接指定字元串n 的字元串。
?!n 比對任何 其後沒有緊接指定字元串n 的字元串。
n+ n出現了{1. }次 1 - infinity 貪婪
n* n出現了{0, }次 0 - infinity 貪婪
n? n出現了{0,1}次 0 - 1
const reg = /\w+/g;
const str = 'abcds';
reg.test(str); // true
console.log(str.match(reg)); // ["abcds"]
const reg = /\w*/g;
const str = 'abcd';
reg.test(str); // true
console.log(str.match(reg)); // ["abcd", ""]
// 第一次比對 * = 3, 第二次比對 * = 0
const reg = /\d*/g; // 數字
const str = 'abcd';
reg.test(str); // true
console.log(str.match(reg)); // ["", "", "", ""]
// 第一次比對 * = 0,第二次比對 * = 0,第三次比對 * = 0,第四次比對 * = 0
const reg = /\w?/g;
const str = 'aaa';
reg.test(str); // true
console.log(str.match(reg)); // ["a", "a", "a", ""]
n{X} X個n
n{X,Y} X到Y個n 貪婪
n{X, } 至少X個n 貪婪
const reg = /\w{3}/g;
const str = 'aaaaaaaaaaaaaa';
reg.test(str); // true
console.log(str.match(reg)); // ["aaa", "aaa", "aaa", "aaa"]
const reg = /\w{3,5}/g;
const str = 'avbsdsghg';
reg.test(str); // true
console.log(str.match(reg)); // ["avbsd", "sghg"]
const reg = /\w{3,}/g;
const str = 'avbsdsghg';
reg.test(str); // true
console.log(str.match(reg)); // ["avbsdsghg"]
是幾個\w,不是取一個\w 再乘量詞,不能保證都相同 例:
["avbsd", "sghg"]
n$ 比對任何 結尾為n 的字元串。
^n 比對任何 開頭為n 的字元串。
const reg1 = /^abc/g;
const reg2 = /fg$/g;
const str = 'abcdefg';
console.log(str.match(reg1)); // ["abc"]
console.log(str.match(reg2)); // ["fg"]
正向預查 正向斷言
const str = 'abaaaa';
const reg = /a(?=b)/g; // a後面跟着b,但是b不參與選擇
const reg1 = /a(?!b)/g;
console.log(str.match(reg)); // ["a"]
console.log(str.match(reg1)); // ["a", "a", "a", "a"]
RegExp 對象屬性
屬性 描述
global RegExp 對象是否具有标志g。
ignoreCase RegExp對象是否具有标志i。
multiline RegExp對象是否具有标志m。
source 正規表達式的源文本。字元串展示
lastIndex 一個整數,标示開始 下一次比對 的字元位置。(光标位置,可以修改)
RegExp 對象方法
方法 描述
compile 編譯正規表達式。
exec 檢索字元串中指定的值。傳回找到的值,并确定其位置。
test 檢索字元串中指定的值。傳回true或false。
const reg = /ab/g;
const str = 'abababab';
console.log(reg.lastIndex); // 0
console.log(reg.exec(str));
// ["ab", index: 0, input: "abababab", groups: undefined]
// 類數組,index 比對到片段時光标的位置
const str = 'aaaabbbc';
const reg = /(\w)\1\1/g;
// (\w) : 子表達式
// \1 : 反向引用第一個子表達式的内容
// (\w)\1 : 第一個子表達式比對到的值copy一下,例如第一個子表達式比對到a,則正規表達式為aa
console.log(str.match(reg)); // ["aaa", "bbb"]
// ((\w)\1(\w)\2) : \1 --> 最外面的括号,,\2 --> 裡面第一個括号
const str = 'aabb';
const reg = /(\w)\1(\w)\2/g;
console.log(str.match(reg)); // ["aabb"]
console.log(reg.exec(str)); // ["aabb", "a", "b", index: 0, input: "aabb", groups: undefined]
支援正規表達式的String對象的方法
方法 描述
search 檢索與正規表達式相比對的值。
match 找到一個或多個正規表達式的比對。
replace 替換與正規表達式比對的子串。
split 把字元串分割為字元串數組。
// str.match();
const str = 'aabb';
const reg = /(\w)\1(\w)\2/;
const reg2 = /(\w)\1(\w)\2/g;
console.log(str.match(reg)); // ["aabb", "a", "b", index: 0, input: "aabb", groups: undefined]
console.log(str.match(reg2)); // ["aabb"]
// str.search();
const str = 'cdfaabb';
const reg = /(\w)\1(\w)\2/;
console.log(str.search(reg)); // 3
const str = 'cdfa';
const reg = /(\w)\1(\w)\2/;
console.log(str.search(reg)); // -1
// str.split()
const str = 'cdfsaf4dsgfds5bvj8dfgdha';
const reg = /(\d)/g;
console.log(str.split(reg)); // ["cdfsaf", "4", "dsgfds", "5", "bvj", "8", "dfgdha"]
const reg1 = /\d/g;
console.log(str.split(reg1)); // ["cdfsaf", "dsgfds", "bvj", "dfgdha"]
// str.replace()
const str = 'aa';
console.log(str.replace('a','b')); // ba
// 沒有通路全局的能力,隻能通路一個
const reg = /a/g;
console.log(str.replace(reg,'b')); // bb
const reg = /(\w)\1(\w)\2/g;
const str = 'aabb';
// console.log(str.replace(reg, '$2$2$1$1')); // bbaa
// $ : 表示子表達式,$1: 子表達式1
console.log(str.replace(reg, function($, $1, $2) { // 正規表達式比對的結果,第一個子表達式内容,第二個子表達式内容
return $1 + $2 + $2 + $ + '123ab'; // 字元串形式
}));
str.toUpperCase() : 變大寫
str.toLowerCase() : 變小寫
在表達式後加?,滿足條件,能少絕不多 ( 非貪心比對 )
const reg = /a+?/g;
// const reg = /a{1,3}?/g; // ["aa", "aa", "aa"]
// const reg = /a+?/g; // ["", "", "", "", "", "", "", ""]
const str = 'aaaaaaa';
console.log(str.match(reg)); // ["a", "a", "a", "a", "a", "a", "a"]
$ 有特殊含義,如果想要用$字元,需要寫兩個 $$(相當于轉義字元
\\
\?
\*
JS高程三
1.渲染模式
在多年以前(IE6誕生以前),各浏覽器都處于各自比較封閉的發展中(基本沒有相容性可談)。随着WEB的發展,相容性問題的解決越來越顯得迫切,随即,各浏覽器廠商釋出了按照标準模式(遵循各廠商制定的統一标準)工作的浏覽器,比如IE6就是其中之一。但是考慮到以前建設的網站并不支援标準模式,是以各浏覽器在加入标準模式的同時也保留了混雜模式(即以前那種未按照統一标準工作的模式,也叫怪異模式)。
三種标準模式的寫法
1.<!DOCTYPE html>
2.<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
3.<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<script>
// var test = '\
// <div></div>\
// <span></span>\
// ';
// console.log(test);
// var reg = /abc/;
// var str = 'abcd';
// console.log(reg.test(str));
// i :ignoreCase 忽視大小寫
var reg1 = /abc/;
var reg2 = /abc/i;
var str1 = 'aBcde';
console.log(reg1.test(str1)); // false
console.log(reg2.test(str1)); // true
// g : global 全局比對(查找所有比對而非在找到第一個比對後停止)
var reg11 = /ab/;
var reg22 = /ab/g;
var str2 = 'ababababab';
console.log(str2.match(reg11)); // ["ab"]
console.log(str2.match(reg22)); // ["ab", "ab", "ab", "ab", "ab"]
// m : 多行比對
var reg111 = /^a/g; // ^a :開頭的a
var reg222 = /^a/gm;
var str3 = 'abcd\na'; //多行字元串,不是寫起來多行
console.log(str3.match(reg111)); // ["a"]
console.log(str3.match(reg222)); // ["a", "a"]
</script>
<script>
// 表達式 描述
// [abc] 查找方括号之間的 任何字元。
// [^abc] 查找任何 不在 方括号之間的字元。 [^a] : 非a
// [0-9] 查找任何從 0至9 的數字。
// [a-z] 查找任何從 小寫a到小寫z 的字元。
// [A-Z] 查找任何從 大寫A到大寫Z 的字元。
// [A-z] 查找任何從 大寫A到小寫z 的字元。
// [adgk] 查找給定集合 内 的任何字元。
// [^adgk] 查找給定集合 外 的任何字元。
// (red|blue|green) 查找任何指定的選項。|:或
const reg = /[1234567890][1234567890][1234567890]/g; // 一個方括号代表一位,裡面是區間,該表達式為取三個數字連在一起的片段
const str = '12334fgsfj5465hgjf'; // 三位一看,不會翻過去 例如1234ui 其中符合比對規則的有:123
console.log(str.match(reg)); // ["123", "546"]
const reg2 = /[ab][cd][d]/g;
const str2 = 'abcd';
console.log(str2.match(reg2)); // ["bcd"]
const reg3 = /(abc|bcd)[0-9]/g;
const str3 = 'bcd8';
console.log(str3.match(reg3)); // ["bcd8"]
</script>