目录
问题
- 最近在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));
- 但最好还是直接用第一种,明确你使用正则的目的
Всё, что нужно знать о покупке аттестата о среднем образовании без рисков
Thanks. https://extensions.work/
prednisone 20 mg tablets raypharm otc prednisone cream
In-game items
Discover a Realm of Virtual Chances with ItemsforGames
At Items4Games, we provide a vibrant hub for players to purchase or trade gaming accounts, items, and options for some of the most popular titles. If you are seeking to upgrade your gaming resources or looking to monetize your game account, our site provides a smooth, protected, and profitable journey.
Reasons to Select Items4Games?
**Broad Game Catalog**: Browse a vast array of games, from intense titles like Battleground and War Call to engaging RPGs like ARK: Survival Evolved and Genshin Impact. We cover everything, making sure no gamer is overlooked.
**Variety of Features**: Our products feature account purchases, virtual money, exclusive goods, trophies, and coaching sessions. Whether you need guidance leveling up or obtaining premium rewards, we are here to help.
**Ease of Use**: Explore easily through our systematized site, categorized by order to get precisely what you are looking for quickly.
**Safe Exchanges**: We focus on your safety. All trades on our platform are handled with the highest security to protect your confidential and financial information.
**Key Points from Our Collection**
– **Action and Exploration**: Titles ARK: Survival Evolved and Day-Z give you the chance to enter tough environments with top-notch items and accesses on offer.
– **Adventure and Exploration**: Enhance your performance in titles such as Clash Royale and Wonders Age with virtual money and services.
– **Professional Gaming**: For competitive enthusiasts, boost your technique with mentoring and account upgrades for Valorant, DotA, and Legends.
**A Hub Made for Players**
Backed by ApexTech Innovations, a established business officially recognized in Kazakhstan, Items4Play is a market where gaming aspirations are realized. From purchasing pre-order keys for the newest titles to finding unique virtual goods, our site meets every gaming wish with skill and reliability.
Join the group right away and elevate your game adventure!
For inquiries or help, contact us at **support@items4games.com**. Together, let’s improve the game, together!
kraken ссылка – кра17.сс, как зайти на кракен
kraken ссылка – официальное зеркало кракен, кракен онион ссылка
доставка алкоголя 24 https://dostavka-alcogolya-v-moskve.ru/
как заказать алкоголь через интернет с доставкой https://dostavka-alcogolya-city-2.ru/
order amoxicillin online no prescription: buy amoxicillin 250mg – amoxicillin 500mg price in canada
нарколог на дом краснодар https://zavitai.mybb.social/viewtopic.php?id=89/ .
вызов нарколога на дом http://motik13.0pk.me/viewtopic.php?id=1995/ .
вызов нарколога на дом краснодар spilkuvannya.rolevaya.com/viewtopic.php?id=66 .
нарколог на дом краснодар http://www.flanrp.rolevaya.com/viewtopic.php?id=146/ .
врач нарколог на дом платный spilkuvannya.rolevaya.com/viewtopic.php?id=66 .
Удаление плесени услуга https://unichtozhenie-pleseni-spb-lo.ru/
prednisone price australia: buy prednisone – prednisone for dogs
Обработка помещения после умершего человека https://dezinfekciya-smerti-msk-mo.ru/
кракен даркнет – kraken вход, kraken вход
кра 17 ат – кракен зеркало, кракен актуальная ссылка
BBgate MarketPlace 2024 Breaking Bad Gate Forum
BBgate MarketPlace
новая ссылка на кракен – зеркало kraken, ссылка на кракен
Диплом вуза купить официально с упрощенным обучением в Москве
how to get generic clomid pill: can i order generic clomid without rx – where can i buy cheap clomid no prescription
ссылка на кракен – kraken onion, кракен даркнет
Предлагаем услуги профессиональных инженеров офицальной мастерской.
Еслли вы искали официальный сервисный центр xiaomi, можете посмотреть на сайте: сервисный центр xiaomi
Наши мастера оперативно устранят неисправности вашего устройства в сервисе или с выездом на дом!
kra 17 сс – kra17.сс, официальное зеркало кракен
kraken onion – kraken onion, кракен зеркало
зеркало kraken – кракен актуальная ссылка, кракен зеркало
prednisone 20mg price: order prednisone on line – 5 mg prednisone tablets
доставка алкоголя на дом москва круглосуточно https://dostavka-alcogolya-nochyu.ru/
buy amoxicillin 250mg: Amoxicillin buy online – amoxicillin 500
5 mg prednisone tablets Prednisone Without Prescription can you buy prednisone over the counter
order amoxicillin no prescription Amoxicillin buy online how much is amoxicillin
вызов нарколога на дом круглосуточно http://krasnogorsk.anihub.me/viewtopic.php?id=2568/ .
нарколог на дом в краснодаре http://www.planeta.mybb.social/viewtopic.php?id=2227 .
нарколог на дом круглосуточно https://www.rolandus.org/forum/viewtopic.php?p=106429/ .
вызвать нарколога на дом http://www.mozaisk.anihub.me/viewtopic.php?id=4368 .
доставка алкоголя 24 https://dostavka-alcogolya-mix-1.ru/
платный нарколог на дом платный нарколог на дом .
вызвать нарколога на дом http://www.orehovo.anihub.me/viewtopic.php?id=2292 .
платный нарколог на дом http://recordrpservak.ukrbb.net/viewtopic.php?f=31&t=1158 .
вызов нарколога на дом краснодар http://orehovo.anihub.me/viewtopic.php?id=2292 .
[url=https://krak-17at.ru]официальное зеркало кракен[/url] – kraken onion, новая ссылка на кракен
врач нарколог на дом платный https://zarabotokdoma.creartuforo.com/viewtopic.php?id=11475/ .
нарколог краснодар нарколог краснодар .
вызвать нарколога на дом вызвать нарколога на дом .
нарколог на дом краснодар https://zarabotokdoma.creartuforo.com/viewtopic.php?id=11475/ .
нарколог на дом advance2.ukrbb.net/viewtopic.php?f=2&t=777 .
вызов нарколога на дом краснодар вызов нарколога на дом краснодар .
кракен зеркало – ссылка на кракен, как зайти на кракен