JS正則表達式:子表達式,反向引用,search和replace方法,面試題,g,i【詩書畫唱】
概括:
視頻觀看筆記
個人對子表達式的理解和運用
個人對search和replace方法的理解和運用?
個人對g和i的理解和運用
這里的\1,就是反向引用
使用反向引用來檢查一個字符串中是否出現(xiàn)4個相同的數(shù)字
簡單判斷身份證號.html
1、判斷一個7位數(shù)字是否是回文數(shù)字。(子表達式,捕獲,反向引用)12321 56965
2、用js寫一個函數(shù),判斷字符串是否是這樣組成的:第一個必須是字母,后面可以是字母、數(shù)字、下劃線,總長度為5-20。如果符合條件返回1,否則返回0。函數(shù)原型:function checkString(str)
3、以下函數(shù)的功能是查詢?yōu)g覽器url中字符串參數(shù),請補全代碼(這題是面試題)
function parseQueryString(name) {
? ? var regexS = "[\\?&]" + name + "=([^&#]*)";
? ? var regx = new RegExp(regexS);
? ? var rs = regx.exec(_____________________________);
? ? if(rs == null) {
? ? ? ? return “”;
? ? }else{
? ? ? ? return ______________;??
? ? }
}
4、用正則表達式實現(xiàn)JS變量命名規(guī)則
5、“我的銀行賬號是xxxxx,我的電話號碼是0731-888888”,將這段文本中的區(qū)號提取出來。
6、從一段文本中找到身份證號碼,然后將生日提取出來。
課堂代碼例子
提醒:
一些題目等等其實只要80%的功能實現(xiàn),正確率就可以,因為一些題目有歧義,同時一些完整功能實現(xiàn)很繁瑣,但其實面試官等等不要求給出繁瑣的答案,他們只是考查部分的答案和實現(xiàn)方法等等你是否知道。
在正則表達式中要先判斷是否是為確定長度的或規(guī)定的數(shù)字等等,如果是,就考慮加^和$。
其實很多都要考慮加^和$。
不加^和$的話,就表示一個字符串含有符合其正則表達式的內(nèi)容就可以。加^和$的話,就表示一個字符串必須是符合其正則表達式的內(nèi)容才可以。



<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script>
var reg = /^(\d)(\d)(\d)\d\3\2\1$/;
console.log(reg.test('1234321'));
//不能以數(shù)字開頭
//以數(shù)字字母下劃線和$
var reg1 = /^[a-zA-Z_$][\w$]*$/;
console.log(reg1.test('a$'));
var reg2 = /^\d{6}(\d{8})\d{3}[\dx]$/;
console.log(reg2.exec(''));
</script>
</head>
<body>
</body>
</html>


面試題:


個人解析:在字符串中是要對問號進行2次轉義的,用2個斜杠,第1個斜桿用于轉義第2個斜杠,而被轉義后的斜杠轉義后面的問號。


視頻觀看筆記 START
個人對子表達式的理解和運用 START

//test方法的值是布爾類型的值
//exec方法返回值是一個數(shù)組






個人對子表達式的理解和運用 END
視頻觀看筆記 END
個人對search和replace方法的理解和運用 START


個人對g和i的理解和運用 START

正則表達式后面加g,在replace方法中體現(xiàn)作用,其他地方很少體現(xiàn)作用:

個人對g和i的理解和運用 END
個人對search和replace方法的理解和運用 END

1、判斷一個7位數(shù)字是否是回文數(shù)字。(子表達式,捕獲,反向引用)12321 56965

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<script>
var reg6 = /^(\d)(\d)(\d)(\d)\3\2\1$/;
var str4 = '3267623';
console.log(reg6.test(str4));
</script>
<body>
</body>
</html>


2、用js寫一個函數(shù),判斷字符串是否是這樣組成的:第一個必須是字母,后面可以是字母、數(shù)字、下劃線,總長度為5-20。如果符合條件返回1,否則返回0。函數(shù)原型:function checkString(str)

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<script>
/*
?2、用js寫一個函數(shù),判斷字符串是否是這樣組成的:第一個必須是字母,
?后面可以是字母、數(shù)字、下劃線,總長度為5-20。如果符合條件返回1,否則返回0。
?函數(shù)原型:function checkString(str)
*/
function checkString(str){
return /^[a-zA-Z]\w{4,19}$/.test(str) ? 1 : 0;
// return /^[a-zA-Z]\d{4,19}$/.test(str)?console.log(1):console.log(0)
}
// checkString("SSHC666")
</script>
<body>
</body>
</html>

3、以下函數(shù)的功能是查詢?yōu)g覽器url中字符串參數(shù),請補全代碼
function parseQueryString(name) {
? ? var regexS = "[\\?&]" + name + "=([^&#]*)";
? ? var regx = new RegExp(regexS);
? ? var rs = regx.exec(_____________________________);
? ? if(rs == null) {
? ? ? ? return “”;
? ? }else{
? ? ? ? return ______________;??
? ? }
}

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<script>
/*
3、以下函數(shù)的功能是查詢?yōu)g覽器url中字符串參數(shù),請補全代碼
function parseQueryString(name) {
? ? var regexS = "[\\?&]" + name + "=([^&#]*)";
? ? var regx = new RegExp(regexS);
? ? var rs = regx.exec(_____________________________);
? ? if(rs == null) {
? ? ? ? return “”;
? ? }else{
? ? ? ? return ______________;??
? ? }
}
*/
function parseQueryString(name) {
? ? var regexS = "[\\?&]" + name + "=([^&#]*)";
? ? var regx = new RegExp(regexS);
? ? var rs = regx.exec("http://localhost:8080/JavaWebProgram?act=詩書畫唱&pwd=666888");
? ? if(rs == null) {
? ? ? ? return "";
? ? }else{
? ? ? ? return rs[1];??
? ? }
}
/* 測試語句:console.log(parseQueryString('act'));
console.log(parseQueryString('pwd'));*/
</script>
<body>
</body>
</html>

4、用正則表達式實現(xiàn)JS變量命名規(guī)則

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<script>
/*
4、用正則表達式實現(xiàn)JS變量命名規(guī)則*/
/*變量命名規(guī)則如下:
1、變量命名必須以字母、下劃線”_”或者”$”為開頭。其他字符可以是字母、_、美元符號或數(shù)字。
2、變量名中不允許使用空格和其他標點符號,首個字不能為數(shù)字。
3、變量名長度不能超過255個字符。
4、變量名區(qū)分大小寫。(javascript是區(qū)分大小寫的語言)
5、變量名必須放在同一行中
6、不能使用腳本語言中保留的關鍵字、保留字、true、false 和 null 作為標識符。
截止到目前為止JS描述了一組具有特定用途的關鍵字,一般用于控制語句的開始或結束,
或者用于執(zhí)行特定的操作等。關鍵字也是語言保留的,不能用作標識符。
if for switch? case? break? continue? while? var? function
*/
/*關鍵字和保留字太多了,我只規(guī)定了部分關鍵字和保留字不能是js變量名,如果
?想js變量名不包含關鍵字和保留字,下面的/^(if|for|switch|case|break|continue|while
|var|function|true|false|null)$/.test(str)==false中的
?^和$就別加上*/
function isJsName(str){
return /^([a-zA-Z]|_|\$)[\w|$]{0,255}$/.test(str)==true
&&(/^(if|for|switch|case|break|continue|while|var|function|true|false|null)$/.test(str)==false)??
'符合JS變量命名規(guī)則':'不符合JS變量命名規(guī)則';
}
console.log(isJsName('$11'));
</script>
<body>
</body>
</html>

5、“我的銀行賬號是xxxxx,我的電話號碼是0731-888888”,將這段文本中的區(qū)號提取出來。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<script>
/*
5、'我的銀行賬號是xxxxx,我的電話號碼是0731-888888',將這段文本中的區(qū)號提取出來。*/
var z = /\d{4}/;
var s = '我的銀行賬號是xxxxx,我的電話號碼是0731-888888';
var arr=z.exec(s);
console.log(arr[0]);
</script>
<body>
</body>
</html>

6、從一段文本中找到身份證號碼,然后將生日提取出來。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<script>
/*
6、從一段文本中找到身份證號碼,然后將生日提取出來。*/
/*身份證號碼為15位或者18位,15位時全為數(shù)字,18位前17位為數(shù)字,最后一位是校驗位,可能為數(shù)字或字符X
?
?/(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/? */
var reg = /(\d{17}(\d|X|x))/;?
var s ='身份證號碼:66666620070717561x';
var arr=reg.exec(s);
console.log(arr[0].slice(6,14));
//.slice(7,13)
</script>
<body>
</body>
</html>

簡單判斷身份證號.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<script>
function isCard(card)?
{?
/*
?
?這里做簡單的驗證,真正0誤差的驗證很長,暫時不寫。
?
?身份證號碼的編排規(guī)則:(1)前1、2位數(shù)字表示:所在省份的代碼;?
?(2)第3、4位數(shù)字表示:所在城市的代碼;?
?(3)第5、6位數(shù)字表示:所在區(qū)縣的代碼;?
?(4)第7~14位數(shù)字表示:出生年、月、日;?
?(5)第15、16位數(shù)字表示:所在地的派出所的代碼;?
?(6)第17位數(shù)字表示性別:奇數(shù)表示男性,偶數(shù)表示女性;?
?(7)第18位數(shù)字是校檢碼:
?也有的說是個人信息碼,一般是隨計算機的隨機產(chǎn)生, 用來檢驗身份證的正確性。
?校檢碼可以是0~9的數(shù)字,有時也用x表示。*/
/*身份證號碼為15位或者18位,15位時全為數(shù)字,18位前17位為數(shù)字,最后一位是校驗位,可能為數(shù)字或字符X*/
var reg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/;?
if(reg.test(card) === false)?
{?
return "身份證輸入不合法";?
}?
else{
return "身份證輸入合法";
}
}
console.log(isCard("66666620070717561x"))
</script>
<body>
</body>
</html>


課堂代碼例子 START

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script>
var s1 = /^ah+u$/;
var s2 = 'ahhhu';
//test方法的值是布爾類型的值
//console.log(s1.test(s2));
//exec方法返回值是一個數(shù)組
var reg1 = /[a-z]=(\d)/;
//console.log(reg1.test('nunenfbe=8yhgg'));
var rs = reg1.exec('pwd=123');
console.log('匹配的字符串片段是:' + rs[0]);
console.log('從下標為:' + rs['index'] + '的地方開始匹配');
console.log('被第一個子表達式捕獲的值是:' + rs[1]);
console.log(rs);
var reg2 = /0731-?(\d{8})/;
? ? ? ? ? ? rs = reg2.exec('abc07318675458812345');
? ? ? ? ? ? console.log(rs[1]);
function parseQueryString(name) {
name = name.replace(/[\[]/,'\\[');
? ? var regexS = '[\\?&]' + name + '=([^&#]*)';
var regx = new RegExp(regexS);
var rs = regx.exec('http://localhost:8888/demo?act=admin&pwd=123');
? ? if(rs == null) {
return '';
}else{
? ? return rs[1];??
}
}
//console.log(parseQueryString('act'));
//console.log(parseQueryString('pwd'));
//普通字符串的兩個跟正則表達式有關系的方法
//i:忽略大小寫
//g:全字符串搜索
var reg3 = /[aeiou]/g;
var str1 = 'hello world';
//查找str1字符串中出現(xiàn)了aeiou字符的地方
console.log(str1.search(reg3));
//將str1字符串中出現(xiàn)的aeiou字符全部替換成@
console.log(str1.replace(reg3,'@'));
var reg4 = /co+m/i;
var str2 = 'www.Com';
console.log(str2.search(reg4));
console.log(str2.replace(reg4,'cn'));
var reg5 = /(\d)(\d)\d\1/;
var str3 = 'a3563b';
//reg5.test(str3);//\1=8,\2=6
//在表達式中再次使用\1中的值時就叫反向引用
//檢查一個字符串中是否出現(xiàn)四個相同的數(shù)字
var reg6 = /(\d)\1{3}/;
var str4 = 'oip77755555321a';
console.log(reg6.test(str4));
//判斷輸入的五位數(shù)字是不是回文數(shù)字
</script>
</head>
<body>
</body>
</html>
