網站首頁 編程語言 正文
最近在練習正則表達式,遇到了一道很有意思的題,題目如下
我的答案如下
(?=.*?[A-Z])(?=.*?\d)(?=.*?[a-z]).{8,}
對于這個答案的理解得先從正向先行斷言的語法開始說起。
正向先行斷言的語法格式如下
expression1(?=expression2)
# 查找expression2前面的expression1
當然這個expression1也可以不寫(也就是為空白符)
例子如下
該正則表達式的意思為:尋找abcd字符串前的123456字符串。
這里也提一個有意思的地方
以上兩個正則表達式中的/\d+/gm和/123456/gm其實都能匹配123456這個字符串,但在正向先行斷言中,前者會匹配每個數字前面的空白符,后者將123456字符串當成一個整體,只匹配這個整體前面的空白符。
這里面的原理還需要等我研究一下,估計是跟底層代碼的實現有關,我猜測是(?=\d+)在匹配的時候會將每個數字單獨提取出然后向前比較。
那么回到該題的答案中,先讓我們看看?(?=.*?[A-z])?是什么意思。
很明顯上圖匹配了大寫字母A前面的所有空白符
其中的.*?[A-Z]代表大寫字母及其前面的字符串且為懶惰匹配
那么(?=.*?[A-Z])(?=.*?\d)的意思就有點套娃了,按我的理解就是對于(?=.*?\d)而言把(?=.*?[A-Z])當成expression1,對于(?=.*?[A-Z])而言就是把空白符當成expression1。
那么這個正則表達式就表示為:在尋找到每個大寫字母前面的所有空白符的基礎上還要滿足:這些空白符都在每個數字前面的所有空白符這個匹配集合中。相當于是兩個空白符集合的交集。
所以(?=.*?[A-Z])(?=.*?\d)(?=.*?[a-z])相當于是每個大寫字母、小寫字母、數字前面的所有空白字符的交集。
?而后面的.{8,}則匹配這些空白字符后面至少八位字符(貪婪匹配)。
附:先行否定斷言
x(?!y)稱為先行否定斷言(Negative look-ahead),x只有不在y前面才匹配,y不會被計入返回結果。比如,要匹配后面跟的不是百
分號的數字,就要寫成/\d+(?!%)/。
/\d+(?!\.)/.exec('3.14') // ["14"]
// ["14"]
上面代碼中,正則表達式指定,只有不在小數點前面的數字才會被匹配,因此返回的結果就是14。
“先行否定斷言”中,括號里的部分是不會返回的。
var m = 'abd'.match(/b(?!c)/);
m // ['b']
上面的代碼使用了先行否定斷言,b不在c前面所以被匹配,而且括號對應的d不會被返回。
總結
原文鏈接:https://blog.csdn.net/Adam_captain/article/details/123379815
相關推薦
- 2022-12-07 C++?兩個vector對象拼接方式_C 語言
- 2022-09-12 Sublime中View?in?Browser功能不生效問題及解決_相關技巧
- 2022-09-18 iOS開發底層探索界面優化示例詳解_IOS
- 2023-07-16 oracle 創建定時任務
- 2022-09-21 Flutter定義tabbar底部導航路由跳轉的方法_Android
- 2022-10-01 如何在Python中對文件進行操作_python
- 2022-11-05 Nginx配置文件中location配置的多種場景_nginx
- 2022-10-11 React -配置文件中需要使用組件中異步請求到的數據
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支