不允許輸入特殊字符的正則表達式_JavaScript正則表達式常用技巧

1f8b8e3bc16fa48125df1bd91d7cccf4.png

正則表達式是用于匹配字符串中字符組合的模式。在 JavaScript 中,正則表達式也是對象。這些模式被用于 RegExp 的 exectest 方法, 以及 String 的 matchmatchAllreplacesearchsplit 方法。正則表達式的掌握程度能粗略地看出程序員的技術底子,所以技術面試、編程競賽等 都特別喜歡考察正則表達式。本篇就帶你一起夯實一下 JavaScript 正則表達式的一些使用技巧:

創建正則表達式

在 JavaScript 的世界,創建正則表達式有2個方法: (1)使用一個正則表達式字面量,其由包含在斜杠之間的模式組成。比如 :

const reg = /ab+c/

(2)調用RegExp對象的構造函數。比如:

const reg = new RegExp("ab+c")

注意:以上2個方法雖然都能創建正則表達式,但是還是有區別的: (1)使用第一個方法,在腳本加載后正則表達式字面量就會被編譯。當正則表達式保持不變時,使用此方法可獲得更好的性能。 (2)使用第二個方法,在腳本運行過程中用構造函數創建的正則表達式會被編譯。如果正則表達式將會改變,或者它將會從用戶輸入等來源中動態地產生,就需要使用構造函數來創建正則表達式。

當然,這樣表述可能不太深刻,下面找一道面試題帶你實踐一下。

經典面試題 "Word Finder"

題目要求:
使用一個方法來擴展字典,該方法返回與模式匹配的單詞列表。這個模式可以包含字母(小寫)和占位符("?")。占位符只代表一個任意的字母,比如: const fruits = new Dictionary(['banana', 'apple', 'papaya', 'cherry']);
fruits.getMatchingWords('lemon');     // must return []
fruits.getMatchingWords('cherr??');   // must return []
fruits.getMatchingWords('?a?a?a');    // must return ['banana', 'papaya']
fruits.getMatchingWords('??????');    // must return ['banana', 'papaya', 'cherry']補充說明:
(1)單詞和模式都是小寫
(2)返回單詞的順序無關緊要

上面這道題目是典型的 正則表達式應用題,考察的知識點是2個: (1)使用 RegExp 對象 動態創建正則表達式 (2)使用 /./ 匹配一個任意字符

因此不難有如下解決方案(ps:這個是我的解決方案,雖然解法比較low,但是邏輯應該還算清晰,容易理解)

// 字典構造器
function Dictionary(words) {this.words = words;
}// 原型里拓展解法
Dictionary.prototype.getMatchingWords = function(pattern) {let res = []const reg = new RegExp("^" + pattern.replace(/?/g, '.') + "$")  // 創建正則表達式for (let x of this.words) {if (reg.test(x)) res.push(x) }return res
}

如果你有更好的解法,歡迎評論留言哈 ^_^

正則表達式模式

一個正則表達式模式是由簡單的字符所構成的,比如 /abc/;或者是簡單和特殊字符的組合,比如 /ab*c//Chapter (d+).d*/

簡單模式

簡單模式是由想要匹配的具體字符組成,且嚴格匹配字符順序。比如,/abc/ 這個模式就能且僅能匹配 "abc" 字符按照順序同時出現的情況,而 "bac" 或 "cab" 等就無法匹配。

特殊字符

當需要匹配一個不確定的字符串時,比如尋找一個或多個 "b",或者尋找空格,可以在模式中使用特殊字符。特殊字符還包括如下:

  • 斷言:表示一個匹配在某些條件下發生。斷言包括先行斷言、后行斷言和條件表達式
  • 字符類:區分不同類型的字符,例如區分字母和數字
  • 組和范圍:表示表達式字符的分組和范圍
  • 量詞:表示匹配的字符或條件表達式的數量
  • Unicode屬性轉義:基于 Unicode字符屬性區分字符,例如大寫和小寫字母、數字符合和標點

Escaping

當需要使用任何特殊字符的字面值(例如,搜索字符 *),你必須通過在它前面放一個反斜杠來轉義它。 例如,要搜索'a'后跟*后跟'b',你應該使用 /a*b/- 反斜杠“轉義”字符 *,使其成為文字而非特殊符號。將用戶輸入轉義為正則表達式中的一個字面字符串,可以通過簡單的替換來實現:

function escapeRegExp(string) {return string.replace(/[.*+?^${}()|[]]/g, "$&");   //$&表示整個被匹配的字符串
}

使用正則表達式

前面講到,正則表達式可以被用于 RegExp 的 exectest 方法以及 String 的 matchreplacesearchsplit 方法。這些方法在 JavaScript 手冊 中有詳細的解釋,下面只簡單羅列下各自功能,不做展開:

  • exec:在字符串中執行查找匹配的 RegExp 方法,它返回一個數組(未匹配到則返回 null
  • test:在字符串中測試是否匹配的 RegExp 方法,它返回 truefalse
  • match:在字符串中執行查找匹配的 String 方法,它返回一個數組,在未匹配到時會返回 null
  • matchAll:在字符串中執行查找所有匹配的 String 方法,它返回一個迭代器(iterator
  • search:在字符串中測試匹配的 String 方法,它返回匹配到的位置索引,或者在失敗時返回 -1
  • replace:在字符串中執行查找匹配的 String 方法,并且使用替換字符串替換掉匹配到的子字符串
  • split:使用正則表達式或者一個固定字符串分隔一個字符串的String方法,并將分隔后的子字符串存儲到數組中

一個簡單的快速記憶方法: (1)想要知道在一個字符串中的一個匹配是否被找到,使用 testsearch 方法 (2)想得到更多的信息(但是比較慢)則可以使用 execmatch 方法

舉個栗子,使用exec方法在一個字符串中查找一個匹配:

const myRe = /d(b+)d/g;
const myArray = myRe.exec("cdbbdbsbz");

如果不需要訪問正則表達式的屬性,這個腳本通過另一個方法來創建myArray:

const myArray = /d(b+)d/g.exec("cdbbdbsbz");
// 和 "cdbbdbsbz".match(/d(b+)d/g); 相似。
// 但是 "cdbbdbsbz".match(/d(b+)d/g) 輸出數組 [ "dbbd" ],
// 而 /d(b+)d/g.exec('cdbbdbsbz') 輸出數組 [ "dbbd", "bb", index: 1, input: "cdbbdbsbz" ].

如果想通過一個字符串構建正則表達式,那么這個腳本還有另一種方法:

const myRe = new RegExp("d(b+)d", "g");
const myArray = myRe.exec("cdbbdbsbz");

使用括號的子字符串匹配

一個正則表達式模式使用括號,將導致相應的子匹配被記住。例如,/a(b)c / 可以匹配字符串“abc”,并且記得“b”。回調這些括號中匹配的子串,使用數組元素[1],……[n]。

使用括號匹配的子字符串的數量是無限的。返回的數組中保存所有被發現的子匹配。下面的例子說明了如何使用括號的子字符串匹配。

下面的腳本使用 replace() 方法來轉換字符串中的單詞。在匹配到的替換文本中,腳本使用替代的$1, $2 表示第一個和第二個括號的子字符串匹配:

const re = /(w+)s(w+)/;
const str = "John Smith";
const newstr = str.replace(re, "$2, $1");
console.log(newstr);   // 輸出 "Smith, John"

通過標志進行高級搜索

正則表達式有六個可選參數 (flags) 允許全局和不分大小寫搜索等。這些參數既可以單獨使用也能以任意順序一起使用, 并且被包含在正則表達式實例中:

  • g:全局搜索
  • i:不區分大小寫搜索
  • m: 多行搜索
  • s:允許.匹配換行符
  • u:使用Unicode碼的模式進行匹配
  • y:執行“粘性(sticky)”搜索, 匹配從目標字符串的當前位置開始

例如,re = /w+s/g 將創建一個查找一個或多個字符后有一個空格的正則表達式,或者組合起來像此要求的字符串:

const re = /w+s/g;
const str = "fee fi fo fum";
const myArray = str.match(re);
console.log(myArray);// ["fee ", "fi ", "fo "]

使用 .exec() 方法時,與 g 標志關聯的行為是不同的。 (“class”和“argument”的作用相反:在.match()的情況下,字符串類(或數據類型)擁有該方法,而正則表達式只是一個參數,而在.exec()的情況下,它是擁有該方法的正則表達式,其中字符串是參數。對比str.match(re)re.exec(str) ), g標志與.exec()方法一起使用獲得迭代進展:

const xArray; while(xArray = re.exec(str)) console.log(xArray);
// produces: 
// ["fee ", index: 0, input: "fee fi fo fum"]
// ["fi ", index: 4, input: "fee fi fo fum"]
// ["fo ", index: 7, input: "fee fi fo fum"]

除此之外,m標志用于指定多行輸入字符串應該被視為多個行。如果使用m標志,^$匹配的開始或結束輸入字符串中的每一行,而不是整個字符串的開始或結束。


@參考:正則表達式

本文由博客一文多發平臺 OpenWrite 發布!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/532072.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/532072.shtml
英文地址,請注明出處:http://en.pswp.cn/news/532072.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

latex 算法_GitHub項目awesome-latex-drawing新增內容(四):繪制貝葉斯網絡

近期,我們整理和開源了一個基于LaTeX的科技繪圖項目,并將其取名為awesome-latex-drawing(GitHub網址為:https://github.com/xinychen/awesome-latex-drawing),案例包括貝葉斯網絡、圖模型、矩陣/張量示意圖…

python123動物重量排序_python進階

面向對象oopclass Student(object):def __init__(self,name,score)self.name nameself.score scoredef print_score(self)print(%s: %s % (self.name,self.score))給對象發消息實際上就是調用對象對應的關聯函數,我們稱之為對象的方法(Method)。面向對象的程序寫出…

mysql中的生日應該是什么類型_MySQL中的定點數類型

上一篇文章我們嘮叨了浮點數,知道了浮點數存儲小數是不精確的。本篇繼續嘮叨一下MySQL中的另一種存儲小數的方式 —— 定點數。浮點數文章閃現:什么, 0.3 - 0.2 ≠ 0.1 ? 什么鬼定點數類型正因為用浮點數表示小數可能會有不精確的情況,在一些…

python怎么制作圖像_python數字圖像處理(5):圖像的繪制

實際上前面我們就已經用到了圖像的繪制,如:io.imshow(img)這一行代碼的實質是利用matplotlib包對圖片進行繪制,繪制成功后,返回一個matplotlib類型的數據。因此,我們也可以這樣寫:importmatplotlib.pyplot …

axios代理跨域 cli4_vuecli 3.0之跨域請求代理配置及axios路徑配置 莫小龍

vue-cli 3.0之跨域請求代理配置及axios路徑配置問題:在前后端分離的跨域請求中,報跨域問題配置:vue.config.js:module.exports {runtimeCompiler: true,publicPath: /, // 設置打包文件相對路徑devServer: {// open: process.pla…

string轉為char數組_StringBuilder的區別是什么?String是不可變?一點課堂(多岸學院)...

String和StringBuffer、StringBuilder的區別可變性簡單的來說:String 類中使用 final 關鍵字字符數組保存字符串,private final char value[],所以 String 對象是不可變的。而StringBuilder 與 StringBuffer 都繼承自 AbstractStringBuild…

python去年軟件排行_2017年編程語言排行榜,Python位居榜首(C語言需求最大)

最近IEEE Spectrum 發布了編程語言交互式排行榜,為很多學習代碼的朋友們詳解各類代碼語言的需求和占有率。為學習代碼的朋友們能更加重視哪一種編程語言而有一個明確的方向。下面排行榜123網為你公布2017年編程語言排行榜,Python位居榜首(C語言需求最大)。2017年編程…

mysql test數據庫_mysql數據庫test

Re介紹一下CentOS下MySQL數據庫的安裝與配置方法MySQL數據庫配置的具體步驟:1、編輯MySQL的配置文件,使用vi /etc/my.cnf[rootsample ~]# vi /etc/my.cnf  ← 編輯MySQL的配置文件[mysqld]datadir/var/lib/mysqlsocket/var/lib/mysql/mysql.sock# Defau…

mysql 升級 openssl_【1分鐘教程】LNMP架構應用實戰 Openssl升級操作

由于實際生產環境需求,需要將LNMP環境中的openssl版本升級至目前最新版本openssl-1.1.0c,這玩意升級還真的不是一般的麻煩,由于它與系統各種服務都有相關的聯系,比如ssh服務等,因此,升級非常的繁瑣,所以今天…

miui秒解bl鎖_MIUI12解鎖bl篇(原諒我的過失,接上篇文章)

求原諒真心求原諒由于我的疏忽,上期教程不完整,對大家造成不便在這里給大家真誠道歉!對不起!請收下我的膝蓋!!!我的上個教程小米手機MIUI系統降級任意版本通用教程,MIUI12→MIUI9因為…

腐蝕rust服務器命令_【使用 Rust 寫 Parser】2. 解析Redis協議

系列所有文章https://zhuanlan.zhihu.com/p/115017849?zhuanlan.zhihu.comhttps://zhuanlan.zhihu.com/p/139387293?zhuanlan.zhihu.comhttps://zhuanlan.zhihu.com/p/146455601?zhuanlan.zhihu.comhttps://zhuanlan.zhihu.com/p/186217695?zhuanlan.zhihu.com在基本熟悉 n…

python中dic_python之dic {字典}(重要指數*****)

1. 什么是字典{name: 汪峰, age: 18} 鍵:值 別的語言鍵值對數據鍵: 必須是可哈希(不可變的數據類型),并且是唯一的值: 任意可以保存任意類型的數據字典是無序的python3.6版本以上,默認定義了順序,python3.5以下是隨機顯示不能進?切片?作. 它只能通過key來獲取dict中的數據字典…

python裝飾器帶參數函數二階導數公式_一文搞定Python裝飾器,看完面試不再慌

本文始發于個人公眾號:TechFlow,原創不易,求個關注今天是Python專題的第12篇文章,我們來看看Python裝飾器。一段囧事差不多五年前面試的時候,我就領教過它的重要性。那時候我Python剛剛初學乍練,看完了廖雪…

centos7源碼安裝mysql報錯_CentOS7 下源碼安裝MySQL數據庫 8.0.11

本文主要向大家介紹了CentOS7 下源碼安裝MySQL數據庫 8.0.11,通過具體的內容向大家展現,希望對大家學習MySQL數據庫有所幫助。CentOS7 下源碼安裝MySQL 8.0.11系統環境:CentOS7, 內核:Linux 3.10.0-862.el7.x86_64如果…

python全排列問題_Python基于回溯法子集樹模板解決全排列問題示例

本文實例講述了Python基于回溯法子集樹模板解決全排列問題。分享給大家供大家參考,具體如下:問題實現 a, b, c, d 四個元素的全排列。分析這個問題可以直接套用排列樹模板。不過本文使用子集樹模板。分析如下:一個解x就是n個元素的一種排列&a…

file js new 傳到后臺_js 圖片上傳傳給后臺的3種格式

$("#imgfile").change(function () {var formData new FormData();$.each($(#imgfile)[0].files, function (i, file) {formData.set(idcard, file); //idcard 字段 根據自己后端接口定});//processData: false, contentType: false,多用來處理異步上傳二進制文件。…

usbserialcontroller驅動安裝不了_win10-有NVIDIA獨顯提示未安裝控制面板的離線安裝方式...

最近越來越多的用戶反映NVIDIA顯卡驅動設置不了啦,找不到NVIDIA顯卡的控制面板。 也不知道NVIDIA在什么版本開始驅動安裝包就不自帶NVIDIA顯卡控制面板了。 全新安裝的顯卡驅動就沒有控制面板;或者Windows 10自帶更新了顯卡新版驅動后導致沒有。 每次帶N…

mysql 多實例 獨立配置文件_三、安裝配置多實例MYSQL5.6-多獨立配置文件方法

三、安裝配置多實例MYSQL5.6-多獨立配置文件方法1、準備工作檢查操作系統版本、內核版本、selinux是否關閉、防火墻策略、IP地址、主機名配置、host表配置、yum配置上傳cmake、mysql5.6軟件包具體步驟參考源碼安裝mysql-單實例配置文檔2、安裝cmake軟件2.1 安裝編譯軟件環境[[e…

python做什么模型_主題模型初學者指南[Python]

引言近年來涌現出越來越多的非結構化數據,我們很難直接利用傳統的分析方法從這些數據中獲得信息。但是新技術的出現使得我們可以從這些輕易地解析非結構化數據,并提取出重要信息。主題模型是處理非結構化數據的一種常用方法,從名字中就可以看…

python實現隊列_Python學習教程:用隊列實現棧

接著上一期跟大家說的用棧實現隊列,這期的Python學習教程跟大家講用隊列實現棧題目:使用隊列實現棧的下列操作:push(x) – 元素 x 入棧pop() – 移除棧頂元素top() – 獲取棧頂元素empty() – 返回棧是否為空Implement the following operati…