目录
问题
- 最近在js中使用正则时,出现了相同的字符串,给相同的正则进行匹配,结果非常规律地返回一次true,一次false,一次true,一次false的结果
- 一开始感觉非常不可思议,因为正则表达式和字符串都一样,进行匹配却得到了不同的结果,而且还固定交替出现true和false。
- 后来直接百度搜"JS正则表达式离奇bug",结果出现了很多关于全局匹配/g的解答,这也正是我遇到的问题的根源所在。
- 下面我们详细聊聊。
全局匹配/g
- 首先我们需要知道正则表达式的匹配方式,总的来说无非两种:
- 搜索:只要求给定字符串中存在可以被正则表达式匹配的字符(或字符串)即算成功
- 例如:
- 给定字符串:"123abc456"
- 正则表达式:/\d+/
- 结果:true
- "123"
- "456"
- 可以看到,整个字符串并不能匹配正则表达式,但它存在可以匹配的子串"123"和"456",因此匹配成功,或者说是搜索成功
- 例如:
- 完全匹配:即给定的字符串必须可以被正则表达式完全匹配才算成功
- 例如:
- 给定字符串:"123abc456"
- 正则表达式:/^\d+$/
- 注意表达式的开头多了个^(即从字符串开头)和末尾的$(到字符串的结尾),表示整个字符串得从头到尾正确匹配我们的正则表达式
- 结果:false
- 由于字符串不能匹配正则表达式,因此匹配失败
- 例如:
- 搜索:只要求给定字符串中存在可以被正则表达式匹配的字符(或字符串)即算成功
- 而本文的问题就出现在搜索模式上
- 全局匹配。在声明正则表达式之后加上g,如:
- /\d+/g 或 new RegExp("\\d+", "g")
- 注意全局匹配是搜索的方式
- 之前就是理解错了全局匹配的意思,以为它是完全匹配,所以用错了
分析
- 使用全局匹配时,正则表达式对象的 lastIndex 属性需要注意:
- 初始化默认为0
- 若匹配成功,则lastIndex被置为被匹配的子字符串的末尾下标再+1
- 若匹配失败,则lastIndex被置为0
- 每次使用该正则表达式对象去匹配时,都会从这个lastIndex开始
- 因此,在文章开头,我们使用同一个全局匹配模式的正则对象去匹配时,过程如下:
- 假设字符串为"123456"
- 假设正则表达式为:/\d+/g
- 第一次使用,lastIndex初始为0,字符串整个被匹配,lastIndex = 6(被匹配字符串的末尾(字符6)的下标5 + 1),匹配成功
- 第二次使用,从lastIndex=6开始拿字符串,正则对象拿到的待匹配字符串其实就是空串 "",显然空串不能匹配我们的正则,因此匹配失败,注意此时lastIndex因匹配失败被置为0
- 第三次使用,从lastIndex=0开始,又和第一次使用一样,匹配成功且lastIndex = 6
- 第四次使用,从lastIndex=6开始,和第二次使用一样,拿到了空串,匹配失败且lastIndex = 0
- 因此会出现交替的成功、失败
解决
- 知道了原因后其实就解决就简单了,这里主要由四种办法:
- 1:简单粗暴把正则表达式的全局匹配/g去掉,使用完全匹配,即创建正则对象时不使用/g参数
- 2:每次使用前,把正则对象的 lastIndex 手动置0
- 3:每次都重新创建正则对象,因为初始化默认的lastIndex为0,本质和第二种办法差不多
- 4:奇特的方法,既然是本应匹配成功的时候却交替的出现成功和失败,而本应匹配失败的时候是一直出现失败。那么我们就可以连续两次进行匹配,将两次的结果或 | 起来就可以了。
- 如:字符串str = "123456" 和正则表达式 reg = /\d+/g
- return (reg.test(str) | reg.test(str));
- 但最好还是直接用第一种,明确你使用正则的目的
Jugabet apuestas deportivas Jugabet apuestas deportivas .
Jugabet registro Jugabet registro .
Jugabet casino m?vil Jugabet casino m?vil .
https://prednibest.com/# prednisone 10 tablet
Jugabet casino Jugabet casino .
фільми онлайн у високій якості 2024 фільми онлайн безкоштовно
фільм серія дивитись онлайн дивитися кіно онлайн
ciprofloxacin over the counter ci pharm delivery buy cipro online usa
Jugabet casino m?vil [url=http://www.aqvakr.forum24.ru/?1-7-0-00011967-000-0-0-1734608905]Jugabet casino m?vil[/url] .
Mitolyn review
Jugabet casino Jugabet casino .
ALPHA BITES REVIEW
Jugabet casino en vivo Jugabet casino en vivo .
https://polisos63.ru/
Jugabet registro Jugabet registro .
MITOLYN REVIWS
http://clomidonpharm.com/# where can i buy generic clomid without insurance
Предлагаем услуги профессиональных инженеров офицальной мастерской.
Еслли вы искали ремонт телефонов honor, можете посмотреть на сайте: ремонт телефонов honor адреса
Наши мастера оперативно устранят неисправности вашего устройства в сервисе или с выездом на дом!
Jugabet Jugabet .
prednisone generic brand name: prednisone 5mg over the counter – can i buy prednisone over the counter in usa
Предлагаем услуги профессиональных инженеров офицальной мастерской.
Еслли вы искали ремонт телефонов honor, можете посмотреть на сайте: ремонт телефонов honor цены
Наши мастера оперативно устранят неисправности вашего устройства в сервисе или с выездом на дом!
### 貓飼料選擇指南:如何挑選最適合您愛貓的飼料?
貓咪是許多家庭的可愛成員,選擇適合的貓飼料不僅能確保牠們健康,還能讓牠們保持快樂。市面上的貓飼料種類繁多,如何找到最適合您愛貓的選擇呢?本文將為您提供一些實用的建議。
#### 貓飼料的基本類型
1. **乾飼料(乾糧)**
– 優點:方便存放、價格相對實惠,有助於清潔貓咪牙齒。
– 缺點:水分含量低,貓咪需要額外補充水分。
2. **濕飼料(罐頭或袋裝)**
– 優點:水分含量高,適合需要額外補水的貓咪,口感較佳。
– 缺點:開封後需冷藏,保存期限較短。
3. **冷凍乾燥飼料**
– 優點:保留了食材的營養,方便攜帶且保存期長。
– 缺點:價格較高,需用水泡發後餵食。
4. **生鮮飼料**
– 優點:最接近貓咪天然飲食習慣,營養豐富。
– 缺點:需嚴格控溫保存,製作麻煩。
#### 挑選貓飼料的關鍵因素
1. **年齡和生命階段**
– 幼貓、成貓、老年貓的營養需求不同。選擇標示適合該階段的飼料。
2. **健康狀況**
– 若貓咪有特殊健康問題(如腎臟病、肥胖或過敏),應選擇專門配方的醫療飼料。
3. **成分與營養標示**
– 優質貓飼料的第一項成分應為肉類或魚類,避免含過多填充劑(如玉米、小麥)。
4. **貓咪的口味偏好**
– 每隻貓咪的口味都不同,可能需要嘗試多種品牌來找到最受牠們喜愛的選擇。
5. **品牌信譽與評價**
– 選擇有良好口碑和高評價的品牌,並注意是否有第三方檢測認證。
#### 如何逐步更換貓飼料?
如果需要更換貓咪的飼料,請遵循以下步驟以避免腸胃不適:
1. 第1-3天:新飼料混入原飼料的25%。
2. 第4-6天:新飼料比例提升至50%。
3. 第7-9天:新飼料比例提升至75%。
4. 第10天以後:完全更換為新飼料。
#### 常見問題解答
1. **我的貓咪不喝水,怎麼辦?**
– 可以選擇濕飼料,或在乾飼料上噴一些水。
2. **如何分辨貓飼料是否過期?**
– 注意包裝上的有效日期,並確保飼料沒有異味或變色。
3. **可以給貓咪吃人類食物嗎?**
– 一些人類食物對貓咪有害,如巧克力、洋蔥、大蒜,應避免餵食。
#### 總結
選擇適合的貓飼料需要考量多種因素,包括貓咪的年齡、健康狀況和口味偏好。為了確保愛貓健康,建議定期諮詢獸醫,並為牠們提供均衡的飲食。讓您的貓咪擁有健康快樂的每一天!
Здесь можно купит сейф для дома купить сейф для дома
prednisone 20mg prices: prednisone 20mg cheap – buying prednisone from canada
how to get generic clomid order clomid without a prescription where can i get cheap clomid without insurance
https://amoxstar.com/# amoxicillin 500 tablet
Fitspresso review
amoxicillin in india amoxicillin medicine amoxacillian without a percription
сколько стоит проект перепланировки сколько стоит проект перепланировки .
поролон мебельный в розницу поролон мебельный в розницу .
электрические гардины для штор электрические гардины для штор .
https://cleaning-dm.ru/
Зарабатывайте больше денег на onexbet, не выходя из дома.
onexbet – ваш шанс на богатство, где бы вы ни находились.
Победные ставки с onexbet, самые выгодные коэффициенты.
Получите эмоциональный заряд от игры на onexbet, и у вас не будет никаких сожалений.
onexbet – качество и профессионализм, для вас всегда в приоритете.
Хотите ли вы заработать крупные суммы? Вам нужен onexbet, – самый удачный выбор для вас.
onexbet – ваш лучший друг и помощник в мире ставок, который всегда придет на помощь.
Onexbet – ваш путь к вершине, добивайтесь успеха вместе с onexbet.
onexbet – это не просто азарт, это философия, которая помогает вам выразить себя.
Хотите изменить свою жизнь к лучшему? Начните с onexbet, и вы поймете, что удача всегда на вашей стороне.
onexbet – это не просто сайт ставок, это ваша дорога к богатству, который приведет вас к желаемым результатам.
Ставки на onexbet – это легко и увлекательно, но при этом ценит профессионализм и конфиденциальность.
Лучшие коэффициенты и выигрыши на onexbet, все это доступно для вас.
Готовы к новым достижениям? Начните с onexbet, и вы удивитесь своим результатам.
1 onexbet 1 onexbet .
сколько стоит проект перепланировки сколько стоит проект перепланировки .
проект перепланировки квартиры проект перепланировки квартиры .
автоматический карниз для штор автоматический карниз для штор .
поралон http://porolon-dlya-divana.ru/ .
механизм для штор электрический механизм для штор электрический .
поролон тонкий 5 мм поролон тонкий 5 мм .
ciprofloxacin 500mg buy online: CiPharmDelivery – purchase cipro
как сделать проект перепланировки квартиры как сделать проект перепланировки квартиры .
купить поролон для кровати купить поролон для кровати .
электрокарниз купить электрокарниз купить .
https://prednibest.com/# prednisone cream rx
сделать проект перепланировки сделать проект перепланировки .
автоматический карниз для штор автоматический карниз для штор .
купить мебельный поролон купить мебельный поролон .
где заказать проект перепланировки квартиры в москве где заказать проект перепланировки квартиры в москве .
электрокранизы elektrokarniz-dlya-shtor499.ru .
gfhfkjy porolon-dlya-divana.ru .