Особенности регулярных выражений в Javascript
Регулярные выражения в javascript немного странные. Вроде - перловые, обычные, но с подводными камнями, на которые натыкаются даже опытные javascript-разработчики.
Эта статья ставит целью перечислить неожиданные фишки и особенности RegExp в краткой и понятной форме.
Общую информацию о регулярных выражениях в javascript вы можете найти в статье Регулярные выражения.
Для поиска в многострочном режиме почти все модификации перловых регэкспов используют специальный multiline-флаг.
И javascript здесь не исключение.
Попробуем же сделать поиск и замену многострочного вхождения. Скажем, будем заменять [u] ... [/u] на тэг подчеркивания: <u> :
function bbtagit(text) {
text = text.replace(/\[u\](.*?)\[\/u\]/gim, '<u>$1</u>')
return text
}
var line = "[u]мой\n текст[/u]"
alert( bbtagit(line) )
Попробуйте запустить. Заменяет? Как бы не так!
Дело в том, что в javascript мультилайн режим (флаг m ) влияет только на символы ^ и $, которые начинают матчиться с началом и концом строки, а не всего текста.
Точка по-прежнему - любой символ, кроме новой строки. В javascript нет флага, который устанавливает мультилайн-режим для точки. Для того, чтобы заматчить совсем что угодно - используйте [\s\S] .
Работающий вариант:
function bbtagit(text) {
text = text.replace(/\[u\]([\s\S]*)\[\/u\]/gim, '<u>$1</u>')
return text
}
var line = "[u]мой\n текст[/u]"
alert( bbtagit(line) )
Это не совсем особенность, скорее фича, но все же достойная отдельного абзаца.
Все регулярные выражения в javascript - жадные. То есть, выражение старается отхватить как можно больший кусок строки.
Например, мы хотим заменить все открывающие тэги <a> . На что и почему - не так важно.
text = '1 <A href="#">...</A> 2'
text = text.replace(/<A(.*)>/, 'TEST')
alert(text)
При запуске вы увидите, что заменяется не открывающий тэг, а вся ссылка, выражение матчит ее от начала и до конца.
Это происходит из-за того, что точка-звездочка в "жадном" режиме пытается захватить как можно больше, в нашем случае - это как раз до последнего > .
Последний символ > точка-звездочка не захватывает, т.к. иначе не будет совпадения.
Как вариант решения используют квадратные скобки: [^>] :
text = '1 <A href="#">...</A> 2'
text = text.replace(/<A([^>]*)>/, 'TEST')
alert(text)
Это работает. Но самым удобным вариантом является переключение точки-звездочки в нежадный режим. Это осуществляется простым добавлением знака "? " после звездочки.
В нежадном режиме точка-звездочка пустит поиск дальше сразу, как только нашла совпадение:
text = '1 <A href="#">...</A> 2'
text = text.replace(/<A(.*?)>/, 'TEST')
alert(text)
В некоторых языках программирования можно переключить жадность на уровне всего регулярного выражения, флагом.
В javascript это сделать нельзя.. Вот такая особенность. А вопросительный знак после звездочки рулит - честное слово.
Иногда нужно в самом паттерне поиска обратиться к предыдущей его части.
Например, при поиске BB-тагов, то есть строк вида [u]...[/u] , [b]...[/b] и [s]...[/s] . Или при поиске атрибутов, которые могут быть в одинарных кавычках или двойных.
Обращение к предыдущей части паттерна в javascript осуществляется как \1, \2 и т.п., бэкслеш + номер скобочной группы:
text = ' [b]a [u]b[/u] c [/b] '
var reg = /\[([bus])\](.*?)\[\//*u*/\1/*/u*/\]/
text = text.replace(reg, '<$1>$2</$1>')
alert(text)
Обращение к скобочной группе в строке замены идет уже через доллар: $1 . Не знаю, почему, наверное так удобнее..
P.S. Понятно, что при таком способе поиска bb-тагов придется пропустить текст через замену несколько раз - пока результат не перестанет отличаться от оригинала.
Эти две задачи решаются в javascript принципиально по-разному.
Начнем с "простого".
Для замены всех вхождений используется метод String#replace.
Он интересен тем, что допускает первый аргумент - регэксп или строку.
Если первый аргумент - строка, то будет осуществлен поиск подстроки, без преобразования в регулярное выражение.
Попробуйте:
alert("2 ++ 1".replace("+", "*"))
Каков результат? Как, заменился только один плюс, а не два? Да, вот так.
Чтобы заменить все вхождения, String#replace придется использовать в режиме регулярного выражения.
В режиме регулярного выражения плюс придется заэкранировать, но зато replace заменит все вхождения (при указании флага g ):
alert("2 ++ 1".replace(/\+/g, "*"))
Вот такая особенность работы со строкой.
Очень полезной особенностью replace является возможность работать с функцией вместо строки замены. Такая функция получает первым аргументом - все совпадение, а последующими аргументами - скобочные группы.
Следующий пример произведет операции вычитания:
var str = "count 36 - 26, 18 - 9"
str = str.replace(/(\d+) - (\d+)/g, function(a,b,c) { return b-c })
alert(str)
В javascript нет одного универсального метода для поиска всех совпадений.
Для поиска без запоминания скобочных групп - можно использовать String#match:
var str = "count 36-26, 18-9"
var re = /(\d+)-(\d+)/g
result = str.match(re)
for(var i=0; i<result.length; i++) alert(result[i])
Как видите, оно исправно ищет все совпадения (флаг 'g' у регулярного выражения обязателен), но при этом не запоминает скобочные группы. Эдакий "облегченный вариант".
В сколько-нибудь сложных задачах важны не только совпадения, но и скобочные группы. Чтобы их найти, предлагается использовать многократный вызов RegExp#exec.
Для этого регулярное выражение должно использовать флаг 'g' . Тогда результат поиска, запомненный в свойстве lastIndex объекта RegExp используется как точка отсчета для следующего поиска:
var str = "count 36-26, 18-9"
var re = /(\d+)-(\d+)/g
var res
while ( (res = re.exec(str)) != null) {
alert("Найдено " + res[0] + ": ("+ res[1]+") и ("+res[2]+")")
alert("Дальше ищу с позиции "+re.lastIndex)
}
Проверка while( (res = re.exec(str)) != null) нужна т.к. значение res = 0 является хорошим и означает, что вхождение найдено в самом начале строки (поиск успешен). Поэтому необходимо сравнивать именно с null .
Ну и напоследок - еще одна совсем оригинальная особенность регулярных выражений.
Вот - одна интересная функция.
Запустите ее один раз, запомните результат - и запустите еще раз.
function rere() {
var re1 = /0/, re2 = new RegExp('0')
alert([re1.foo, re2.foo])
re1.foo = 1
re2.foo = 1
}
rere()
В зависимости от браузера, результат первого запуска может отличаться от второго. На текущий момент, это так для Firefox, Opera. При этом в Internet Explorer все нормально.
С виду функция создает две локальные переменные и не зависит от каких-то внешних факторов.
Почему же разный результат?
Ответ кроется в стандарте ECMAScript, пункт 7.8.5:
Цитата...
A regular expression literal is an input element that is converted to a RegExp object (section 15.10)
when it is scanned. The object is created before evaluation of the containing program or function begins.
Evaluation of the literal produces a reference to that object; it does not create a new object.
То есть, простыми словами, литеральный регэксп не создается каждый раз при вызове var r = /regexp/ .
Вместо этого браузер возвращает уже существующий объект, со всеми свойствами, оставшимися от предыдущего запуска.
В отличие от этого, new RegExp всегда создает новый объект, поэтому и ведет себя в примере по-другому.
Есть еще особенности?
Напишите в комментарии, и я добавлю их в статью.
|
พัฒนาระบบมาเป็นระบบออโต้ pg slot เว็บตรง อันดับ1 มาใหม่มาแรงมากที่สุด ในตอนนี้ โปรโมชั่นเน้นๆ จัดเต็มมาให้ผู้ใช้งานได้เล่นกันอย่างเพลิดเพลิด โปรโมชั่น pg slot ระบบมีความปลอดภัยสูงมากที่สุด
คาสิโนออนไลน์ รวมเกมสุดฮิตบนเว็บ pgslot บนมือถือ 24 ชั่วโมง ด้วยระบบออโต้ที่ทันสมัย pg slot ฝาก ถอน เงินด้วยตัวคุณเองง่าย ๆ ไม่มีล่าช้า
Good sharing such valuable information. megagame ล่าสุด
Thank you for sharing such valuable information.
Your website has been a game changer for me, thank you. เมก้าสล็อตล่าสุด
ทางเข้า ยู ฟ่า เบ ท เว็บเดิมพันออนไลน์อันดับ 1 ของเรามีหลากหลายเกม ไม่ว่าจะเป็น เดิมพันกีฬาออนไลน์ บาคาร่าออนไลน์ รูเร็ท เสือมังกร สล็อตออนไลน์ มีระบบ service พร้อมซัฟพอร์ทผู้เล่นตลอด 24 เราจะพาคุณพบสัมผัส
I was impressed by your writing. Your writing is impressive. I want to write like you.카지노게임사이트 I hope you can read my post and let me know what to modify. My writing is in I would like you to visit my blog.
สล็อตแตกง่าย greenx88 2023 เว็บตรงไม่ผ่านเอเยนต์ ที่ได้รับความนิยมอันดับต้น ๆ และเป็นศูนย์รวมเว็บสล็อตออนไลน์อย่างครบถ้วน อยู่ในเว็บไซต์เดียว ดังนั้นหากคุณจะหาเว็บไซต์
สล็อตแตกง่าย greenx88 2023 เว็บตรงไม่ผ่านเอเยนต์ ที่ได้รับความนิยมอันดับต้น ๆ และเป็นศูนย์รวมเว็บสล็อตออนไลน์อย่างครบถ้วน อยู่ในเว็บไซต์เดียว ดังนั้นหากคุณจะหาเว็บไซต์
สล็อตแตกง่าย greenx88 2023 เว็บตรงไม่ผ่านเอเยนต์ ที่ได้รับความนิยมอันดับต้น ๆ และเป็นศูนย์รวมเว็บสล็อตออนไลน์อย่างครบถ้วน อยู่ในเว็บไซต์เดียว ดังนั้นหากคุณจะหาเว็บไซต์
เว็บสล็อตเล่นง่าย ทดลองเล่นฟรี อัพเดทเกมสล็อตใหม่ 2023 สล็อต
Your ideas inspired me very much. 온라인바카라사이트 It's amazing. I want to learn your writing skills. In fact, I also have a website. If you are okay, please visit once and leave your opinion. Thank you.
ทดลองเล่นสล็อตทุกค่ายชั้นนำ ทดลองเล่นpg ทดลองเล่นสล็อตทุกค่าย ฟรีไม่มีค่าใช้จ่าย ไม่ต้องสมัครสมาชิกก็เล่นได้ทุกเกม
ศูนย์รวมเกมสล็อตครบทุกค่ายชั้นนำ ไม่ต้องสมัครเล่นได้เลยรวมเว็บ megagame ท่านสามารถ ทดลองเล่นสล็อต ฟรีกับเราได้ทันที
ทดลองเล่นสล็อตแตกง่าย สล็อตทุนน้อย แตกจริง เล่นสล็อตฟรี เล่นสล็อตฟรี ไม่ต้องสมัคร เล่นฟรีทุกค่าย ทดลองเล่นสล็อตPG ใหม่ล่าสุดก่อนใคร เว็บสล็อตอันดับหนึ่งในไทย
สมัครสมาชิก พีจีสล็อต เล่นสล็อตทดลองเล่น พร้อมรับโบนัส100% ทันที ไปทำกำไร เล่นง่ายไม่มีสะดุด สนุกไปกับเนื้อเรื่องของเกมภายในแอป pgslot game ถูกใจกับระบบ ฝาก ถอน เข้าเกมสล็อตpg จากเราที่เป็นระบบออโต้คุณสามารถทำรายการทุกขั้นตอนด้วยตัวคุณเอง ความสะดวก ความรวดเร็ว จากระบบที่มีความทันสมัยนี้ ตอบโจทย์ทุกความต้องการ ของผู้ใช้งาน ทางเข้าpg slot มือถือ
I finally found what I was looking for! I'm so happy. 온라인카지노 Your article is what I've been looking for for a long time. I'm happy to find you like this. Could you visit my website if you have time? I'm sure you'll find a post of interest that you'll find interesting.
ดาวน์โหลด slotxoสามารถดาวน์โหลดรวมทั้งจัดตั้งแอพพลิเคชั่นสำหรับ เข้าเล่น pgslot ดาวน์โหลดเวอร์ชั่นปัจจุบัน ซึ่งโหลดได้ฟรี ในโทรศัพท์เคลื่อนที่ได้ทุกระบบมีเกมให้เล่นเยอะ
คา สิ โน autoเกมเดิมพันออนไลน์ และเป็นเว็บเดิมพันออนไลน์ PG SLOT ที่รวบรวมเกมไว้ทุกประเภท ให้สมาชิกสามารถเลือกเล่น ได้ตามใจชอบยิ่งไปกว่านั้นยังมีอัตราการจ่ายเงินวันที่สูงอีกด้วย
บ้าน ผล บอล แต่ผมมีคำแนะนำเกี่ยวกับการเดิมพันบอลออนไลน์ให้แก่ผู้ที่สนใจ บ้านผลบอลที่ดีที่สุดเป็นเว็บไซ PG SLOT ต์ที่มีความน่าเชื่อถือและมีความแม่นยำในการทำนาย ผลบอลสด
This text is worth everyone’s attention. Where can I find out more? 사설토토사이트
เสี่ยงโชคกับ mgm 99 ที่มีความน่าเชื่อถือละได้รับการยอมรับอย่างกว้างขวางในวงการเดิมพันออนไลน์ของประเทศไทย ด้วยการให้บริการที่มีคุณภาพและปลอดภัย มีการเล่นเกมคาสิโนที่หลากหลายใน PG SLOT
วิธีสะสมเครดิตฟรีๆ ซึ่งมักจะเป็นเครดิตที่ใช้ในการเดิมพันในเกมคาสิโนออนไลน์ เช่น สล็อตเครื่องสล็อตแมชชีน หรือการเดิมพันกีฬา ซึ่งผู้เล่นสามารถเล่นเกมหรือพนันได้โดยไม่ต้องลงทุนเงินจริง PG SLOT
เกม แตก ดี slot pg แน่ๆ ว่าเวอร์ชั่นใหม่ ปัจจุบัน ของ การเล่นเกม PG SLOT ไปกับเว็บไซต์ ของพวกเรา นั้นสามารถ ให้ความตรึงใจ สำหรับการพนัน พีจีสล็อต กับนักเสี่ยงดวง ทุกคนได้
Hello, I am one of the most impressed people in your article. 안전놀이터 I'm very curious about how you write such a good article. Are you an expert on this subject? I think so. Thank you again for allowing me to read these posts, and have a nice day today. Thank you.
mega game
ทดลองเล่นสล็อต pg ซื้อฟรีสปิน
megagame cc
50รับ100 ถอนไม่อั้น รวมค่าย
tga bet
Live koora can find league matches played in many parts of the world, you can learn instant scores
superslot ดาวน์โหลด เว็บไซต์เดียวจบครบทุกเกมส์ ยอดเยี่ยม เว็บผู้ให้บริการเกมส์ สล็อตออนไลน์ เกมยิงปลา คาสิโน แจกเครดิตฟรี จาก เว็บไซต์ PG รวบรวมความเพลิดเพลินที่ไม่ซ้ำใคร
The main benefits of using 3D floor plans when designing a home are: Easier to visualize and plan out room layouts - You can easily see how a room will look and how the furniture or appliances fit in. This makes planning out a home's layout much easier. More accurate measurements - With a 3D floor plan, you get an exact representation of the home in its current state. This allows for more accurate measurement of room sizes and planning out the most effective use of space. Easier to make changes - With a 3D floor plan, it’s easy to make changes and visualize the difference.
https://therealestaterenderingcompany.com/
https://the2d3dfloorplancompany.com/
เว็บรวมเกมส์ คาสิโน ทุกค่ายไว้ในทีเดียว
แจกโบนัสหนักๆ ฝาก-ถอน รวดเร็ว
เว็บรวมเกมส์ คาสิโน ทุกค่ายไว้ในทีเดียว TGABET แจกโบนัสหนักๆ ฝาก-ถอน รวดเร็ว
If you are interested in investing in virtual currency,
You may have heard of the ‘Binance’ exchange.
Binance
Binance Referral
Binance Code
Binance Fees
Binance Discount
Binance Featured
Join Binance
Binance Method
That's a really impressive new idea! 바카라사이트 It touched me a lot. I would love to hear your opinion on my site. Please come to the site I run once and leave a comment. Thank you.
Someone necessarily help to make severely articles I might state. That is the first time I frequented your web page and up to now? I surprised with the analysis you made to create this actual publish extraordinary. Fantastic process 하하포커
This is very interesting, You are a very skilled blogger. I've joined your rss feed and look forward to seeking more of your wonderful 스포츠토토 . Also, I have shared your website in my social networks!
เชิญพบกันเว็บ สล็อตใหม่ออนไลน์ ล่าสุด pg soft 789 รวมรวมเกมส์สล็อตจากทุกค่าย PG พร้อมลุ้นรับโบนัส จัดหนัก
The website pg soft 789 that gives away the most bonuses, the most promotions, easy to deposit-withdraw, can play anywhere, 24 hours a day.
รวมเกมสล็อตทุกค่ายไว้ที่นี่ gclub ออนไลน์ 2023 จีคลับ888888 ระบบ ฝาก-ถอน ออโต้ 24 ชั่วโมง ไม่มีวันปิดปรับปรุง สนุกเล่นง่ายอยู่ที่ไหนของโลกก็เล่นได้ ทางเว็บเรามีโปรคืนยอดเสีย 10% ทุกวันจันทร์ ไม่ติดเทริน์ถอนออกได้เลยค่ะ
Hello, I am one of the most impressed people in your article. 바카라사이트 I'm very curious about how you write such a good article. Are you an expert on this subject? I think so. Thank you again for allowing me to read these posts, and have a nice day today. Thank you.
Hello, I am one of the most impressed people in your article. 바카라사이트 I'm very curious about how you write such a good article. Are you an expert on this subject? I think so. Thank you again for allowing me to read these posts, and have a nice day today. Thank you.
จุดเด่นเกมสล็อต megaslot168 ตัวเกมสล็อตรูปแบบใหม่ที่น่าสนใจอย่างมาก และทำให้สล็อตพีจี กลายเป็นค่ายเกมชั้นนำแนวหน้าของเมืองไทย ที่ใครเป็นนักปั่นสล็อตตัวจริง บอกเลยว่าไม่ควรพลาด
Your ideas inspired me very much. 토토사이트순위 It's amazing. I want to learn your writing skills. In fact, I also have a website. If you are okay, please visit once and leave your opinion. Thank you.
รับเครดิตฟรีเพื่อเล่น สล็อตออนไลน์ ที่คุณชื่นชอบทันที ลงทะเบียนตอนนี้และเข้าถึงเกม สล็อตเว็บตรง 100% ชั้นนำพร้อมโบนัสที่ยอดเยี่ยม
รับเครดิตฟรีเพื่อเล่นสล็อตออนไลน์ที่คุณชื่นชอบทันที ลงทะเบียนตอนนี้และเข้าถึงเกม สล็อตเว็บตรง 100% ชั้นนำพร้อมโบนัสที่ยอดเยี่ยม
สัมผัสความตื่นเต้นของสล็อตออนไลน์กับ tgabet ผู้ให้บริการสล็อตเว็บตรงชั้นนำ มีโปรโมชั่นต่างๆ ที่รองรับให้กับสมาชิก เช่น โบนัสสมาชิกใหม่ โบนัสฝากครั้งแรก
อย่าเพียงแค่ฝันที่จะชนะรางวัลใหญ่ - ทำให้มันเป็นจริงด้วย และเกมสูงต่ำที่น่าทึ่งของเรา ที่ซึ่งความหลงใหลและความเท่มาบรรจบกันเพื่อประสบการณ์การเล่นเกมออนไลน์ขั้นสุดยอด
Hey there, aspiring thieves! Are you ready to embark on an unforgettable bank heist slot adventure? Join our team, examine the blueprints, and let the reels guide us to lucrative rewards as we execute the perfect plan!
Attention, daring players! Join us in a heart-racing bank heist slot experience where the team of thieves awaits your command. Study the schematics, strategize your approach, and let the reels reveal if fortune favors the bold!
Calling all thrill-seekers! Prepare for an immersive bank heist slot game where the team of thieves is on a mission for unimaginable wealth. Analyze the schematics, fine-tune the strategy, and let the reels spin us towards a fortune-filled victory!
Experience สล็อตเว็บตรง the thrill of online slot games and join the fun with friends and acquaintances.
Discover the สล็อตเว็บตรง exciting world of online slots and introduce your friends to this thrilling gambling adventure.
Indulge in the สล็อตเว็บตรง captivating world of online slots and invite your friends to join you in this lucrative gambling endeavor.
เกมสล็อตแตกง่าย amb superslot app แตกหนักยิ่งกว่าครั้งงก่อน ท้าพิสูจน์ด้วยตัวคุณเอง เข้าทดลองเล่นสล็อตฟรี สมัครสมาชิกง่ายๆ เล่นกับเว็บตรง ลุ้นแตกในเกมแจกโบนัสหลายเท่าแล้ว แล้วยังมีโอกาสเข้าแจ็คพอตรับเงินก้อนโตอีกด้วย
LV177 สล็อตจำเป็นต้องเข้าสู่แพลตฟอร์มการพนันออนไลน์ที่มีเกมนี้ในรายการสินค้าของตนเอง โดยส่วนใหญ่แพลตฟอร์มให้บริการเกม PG SLOT
Thank you for sharing your personal experience on this topic. It's brave of you to be so vulnerable and I know it will help others who are going through similar struggles.
Thank you for sharing your personal experience on this topic. It's brave of you to be so vulnerable and I know it will help others who are going through similar struggles.
온라인카지노
Thank you for sharing your personal experience on this topic. It's brave of you to be so vulnerable and I know it will help others who are going through similar struggles.
온라인카지노
people play the most. We have developed the system well. เมก้าเกม
Join me in unlocking the secrets of TGA, the game that has redefined the boundaries of slot gaming with its mind-blowing CG visuals and addictive gameplay!
Indulge your slot senses in the world of TGA, where jaw-dropping graphics and a thrilling gaming experience converge to create a masterpiece like no other!
Let's embark on an slot unforgettable journey through the virtual realm of TGA, the game that has set the standard for visual brilliance and exhilarating gameplay!
That's the best ever!! The specialty of being an online game that can be. https://megagame168.com
Experience the thrill of PG SLOT top-ranked slot games, enhanced by the mesmerizing CG graphics that set it apart from the rest.
Отправить комментарий
Приветствуются комментарии:Для остальных вопросов и обсуждений есть форум.