Эта статья приняла участие"Проект "Звезда раскопок"", чтобы выиграть творческий подарочный пакет и бросить вызов творческим поощрительным деньгам.
расскажи анекдот
Вчера я долго добирался домой с работы, потому что парковка внизу компании устроена как лабиринт, и каждый раз приходится долго ее находить.
我没有车
о(╥﹏╥)о.
предисловие
Раньше у меня было чувство страха и отвращения к регулярным выражениям, почему? Потому что я всегда чувствую, что это сложно и скучно, и видя, как другие пишут
贼牛逼的正则
, Интересно, когда я смогу быть так же хорош, как они. Пока не увидел эти три очка знаний. . .
просто нужны цветы10 минутвремя, когда вы можете собирать урожай
- в регулярном выраженииПринцип сопоставления местоположения и знания
- в регулярном выраженииПринцип сопоставления строк и знания
- в регулярном выраженииМагия скобок
- 14 распространенных методов синтаксического анализа регулярных выражений, которые помогут понять точки знаний
Поверьте, прочитав эту статью, вы сможете найти решения и решения для более чем 90% регулярных проблем в вашей работе.
Поверьте, прочитав эту статью, вы сможете найти решения и решения для более чем 90% регулярных проблем в вашей работе.
Поверьте, прочитав эту статью, вы сможете найти решения и решения для более чем 90% регулярных проблем в вашей работе.
три раза молча
Регулярное выражение匹配模式
, или匹配字符
, или匹配位置
Регулярное выражение匹配模式
, или匹配字符
, или匹配位置
Регулярное выражение匹配模式
, или匹配字符
, или匹配位置
1. Что я могу сделать, если я понимаю местоположение?
Тема 1: Деление тысяч чисел
Преобразовать 123456789 в 123 456 789
Тема 2: Разделение номеров мобильных телефонов 3-4-4
Преобразование номера мобильного телефона 18379836654 в 183-7983-6654
Тема 3. Проверка подлинности пароля
Длина пароля составляет от 6 до 12 символов, состоящих из цифр, строчных и прописных букв, но должна содержать не менее 2 символов.
Эти вопросы часто возникают в интервью и незаменимы в повседневных делах.Поймите место, не только вы можете получить интервью, но и ваш бизнес будет летать.
Что такое местоположение?
Регулярные выражения — это шаблоны, которые соответствуют либо символу, либо позиции. что это такоеМесто нахожденияШерстяная ткань?
Как показано стрелкой на рисунке ниже, положение можно понимать какположение между соседними символами.
мы можем ипустой строкиПо аналогии начало и конец символов и пробелы можно соединить с пустыми строками.
'hello' === '' + 'h' + '' + 'e' + '' + 'l' + '' + 'l' + '' + 'o' + '' // true
Какие локации?
Символы, обычно используемые в регулярных выражениях для представления позиций:
^, $, \b, \B, ?=p, (?!p), (?
Далее, давайте разберем их один за другим.
^
знак вставки соответствует началу строки
Например, как поставить смайлик (😄 ) в начале приветствия, это вам точно не составит труда
let string = 'hello'
console.log(string.replace(/^/, '😄')) // 😄hello
$
знак доллара, соответствует концу строки
Как насчет того, чтобы поставить смайлик (😄) в конце приветствия с Тонли?
let string = 'hello'
console.log(string.replace(/$/, '😄')) // hello😄
Эти два символа, обозначающие положение головы и хвоста, думаю, всем должны быть знакомы.
\b
Есть три правила для границ слов.
① Позиция между \w и \W
② Позиция между ^ и \w
③ Позиция между \w и $
Как спрятаться на вашем компьютере学习教程
Семя эпизода в папке выглядит такxxx_love_study_1.mp4, хочу превратить его в❤️xxx_love_study_1❤️.❤️mp4❤️
Как это сделать?
На самом деле вам нужно выполнить только одну строку кода
'xxx_love_study_1.mp4'.replace(/\b/g, '❤️') // ❤️xxx_love_study_1❤️.❤️mp4❤️
Понимание рисунка есть
\B
Граница без слов, обратная \b, имеет следующие правила:
① Позиция между \w и \w
② Позиция между \W и \W
③Позиция между ^ и \W
④Позиция между \W и $
также использовать学习教程
Сиды в папке, немного модифицированные, при выполнении этой строчки кода что будет выведено?
'[[xxx_love_study_1.mp4]]'.replace(/\B/g, '❤️')
....
Да, он полон любви! ! ! , Я едва могу видеть имя.
❤️[❤️[x❤️x❤️x❤️_❤️l❤️o❤️v❤️e❤️_❤️s❤️t❤️u❤️d❤️y❤️_❤️1.m❤️p❤️4]❤️]❤️
Рисунок поясняется следующим образом
(?=p)
Соответствует этой позиции перед подшаблоном p. Другими словами, сразу за ней следует позиция, которая должна удовлетворять подшаблону p. Существует также научное название, называемое позитивным прогнозным утверждением.
или этот примерxxx_love_study_1.mp4
, поставить ❤️ перед ххх (ххх может относиться к любому ТП, который вам нравится), как это написать?
Это правильно? Нет, это приведет к исчезновению вашего xxx, так что еще вам нужно сделать?
'xxx_love_study_1.mp4'.replace('xxx', '❤️') // ❤️_love_study_1.mp4
Использование (?=p) может быть очень удобным в этом отношении (можете ли вы представить себе отличие от приведенного выше?)
'xxx_love_study_1.mp4'.replace(/(?=xxx)/g, '❤️') // ❤️xxx_love_study_1.mp4
понимание рисования
(?!p)
Обратное значение (?=p) может быть понято как позиция, отличная от позиции, соответствующей (?=p), принадлежит (?!p) Это также имеет научное название, называемое отрицательным прогнозным утверждением.
'xxx_love_study_1.mp4'.replace(/(?!xxx)/g, '❤️')
// (?=xxx)的输出
❤️xxx_love_study_1.mp4
// (?!xxx)的输出
x❤️x❤️x❤️_❤️l❤️o❤️v❤️e❤️_❤️s❤️t❤️u❤️d❤️y❤️_❤️1❤️.❤️m❤️p❤️4❤️
Внимательно сравните, не совпадает ли он с (?!xxx), за исключением (?=xxx), который соответствует первой позиции.
(?<=p)
Соответствует позиции после подшаблона p (обратите внимание, что (?=p) означает начало). Другими словами, имеется позиция, предыдущая часть которой должна удовлетворять подшаблону p.
Тот же пример: мы хотим поставить ❤️ после ххх (ххх может относиться к любому ТП, который вам нравится), как это написать?
'xxx_love_study_1.mp4'.replace(/(?<=xxx)/g, '❤️') //xxx❤️_love_study_1.mp4
Пояснение к рисунку
(?<!p)
(?
'xxx_love_study_1.mp4'.replace(/(?<!xxx)/g, '❤️')
// (?<=xxx)的输出
xxx❤️_love_study_1.mp4
// (?<!xxx)的输出
❤️x❤️x❤️x_❤️l❤️o❤️v❤️e❤️_❤️s❤️t❤️u❤️d❤️y❤️_❤️1❤️.❤️m❤️p❤️4❤️
Внимательно сравните, не только ли (?
Подробное объяснение каштанов
Изучив знания, связанные с местоположением, давайте попробуем ответить на первые несколько вопросов.
Тема 1: Деление тысяч чисел
Преобразовать 123456789 в 123 456 789
Правило соблюдения вопроса - от конца к началу, добавляя запятую перед каждыми тремя числами,(需要注意的是开头不需要加逗号,)
. это подходит
А как насчет закона (?=p)? p может представлять каждые три цифры, а позиция добавляемой запятой точно соответствует позиции (?=p).
Первый шаг, попробуйте вывести первую запятую после
let price = '123456789'
let priceReg = /(?=\d{3}$)/
console.log(price.replace(priceReg, ',')) // 123456,789
Шаг 2, расставь все запятые
Чтобы расставить все запятые, нужно решить главную проблему: как выразить三个数字一组
, что кратно 3. Мы знаем, что обычные квадратные скобки могут превратить p-шаблон в маленькое целое, поэтому, используя природу скобок, мы можем написать
let price = '123456789'
let priceReg = /(?=(\d{3})+$)/g
console.log(price.replace(priceReg, ',')) // ,123,456,789
Третий шаг, убрать первую запятую,
Вышеупомянутое в основном выполнило требования, но этого недостаточно, появится первая позиция, так как же убрать запятую в первой позиции? Подумайте, есть ли перед вами знание, которое как раз соответствует этой сцене? Правильно (?!p), это он Комбинация из двух заключается в добавлении запятой перед каждыми тремя цифрами сзади вперед, но эта позиция не может быть первой ^.
let price = '123456789'
let priceReg = /(?!^)(?=(\d{3})+$)/g
console.log(price.replace(priceReg, ',')) // 123,456,789
Тема 2: Разделение номеров мобильных телефонов 3-4-4
Преобразование номера мобильного телефона 18379836654 в 183-7983-6654
С методом тысячного деления вышеприведенных чисел, я полагаю, будет гораздо проще сделать этот вопрос, то есть найти это положение от заднего к переднему:
позицию перед каждым четвертым числом и замените эту позицию на -
let mobile = '18379836654'
let mobileReg = /(?=(\d{4})+$)/g
console.log(mobile.replace(mobileReg, '-')) // 183-7983-6654
Тема 3: Раздельный внутренний номер мобильного телефона 3-4-4
Преобразование чисел в пределах 11 цифр номера мобильного телефона в формат 3-4-4
Вспомните этот сценарий. Существует форма, которая должна собирать номер мобильного телефона пользователя. Пользователь вводит один за другим. Нам нужно преобразовать ее в формат 3-3-4, когда пользователь вводит 11-значный номер мобильного телефона. который
123 => 123
1234 => 123-4
12345 => 123-45
123456 => 123-456
1234567 => 123-4567
12345678 => 123-4567-8
123456789 => 123-4567-89
12345678911 => 123-4567-8911
Это не подходит для использования (?=p), например, 1234 станет -1234. Думаете, предыдущие очки знаний подходят для работы с этим сценарием? да (?
первый шаг, сделать первый - выйти
const formatMobile = (mobile) => {
return String(mobile).replace(/(?<=\d{3})\d+/, '-')
}
console.log(formatMobile(123)) // 123
console.log(formatMobile(1234)) // 123-
получить второй - вон
После удаления первого - длина символа увеличивается на одну цифру, исходное 1234567 (вставка -) 8 в этой позиции станет на одну цифру назад.
const formatMobile = (mobile) => {
return String(mobile).slice(0,11)
.replace(/(?<=\d{3})\d+/, ($0) => '-' + $0)
.replace(/(?<=[\d-]{8})\d{1,4}/, ($0) => '-' + $0)
}
console.log(formatMobile(123)) // 123
console.log(formatMobile(1234)) // 123-4
console.log(formatMobile(12345)) // 123-45
console.log(formatMobile(123456)) // 123-456
console.log(formatMobile(1234567)) // 123-4567
console.log(formatMobile(12345678)) // 123-4567-8
console.log(formatMobile(123456789)) // 123-4567-89
console.log(formatMobile(12345678911)) // 123-4567-8911
Тема 4. Проверка легитимности пароля
Длина пароля составляет от 6 до 12 символов, состоящих из цифр, строчных и прописных букв, но должна содержать не менее 2 символов.
Вопрос состоит из трех условий
① Длина пароля 6-12 цифр.
② Состоит из цифр, строчных букв и прописных букв.
③ Должно быть не менее 2 символов.
Первый шаг — записать условия ① и ② и регулярное
let reg = /^[a-zA-Z\d]{6,12}$/
Второй шаг должен содержать определенный символ (цифры, строчные буквы, прописные буквы)
let reg = /(?=.*\d)/
// 这个正则的意思是,匹配的是一个位置,这个位置需要满足`任意数量的符号,紧跟着是个数字`,注意它最终得到的是个位置,而不是数字或者是数字前面有任意的东西
console.log(reg.test('hello')) // false
console.log(reg.test('hello1')) // true
console.log(reg.test('hel2lo')) // true
// 其他类型同理
Третий шаг, напишите полный регулярный
Должен содержать два типа символов, есть следующие четыре перестановки и комбинации
① Комбинация цифр и строчных букв
② Комбинация цифр и заглавных букв
③ Комбинация строчных и прописных букв
④ Объедините цифры, строчные и прописные буквы вместе (но на самом деле первые три покрыли четвертый)
// 表示条件①和②
// let reg = /((?=.*\d)((?=.*[a-z])|(?=.*[A-Z])))/
// 表示条件条件③
// let reg = /(?=.*[a-z])(?=.*[A-Z])/
// 表示条件①②③
// let reg = /((?=.*\d)((?=.*[a-z])|(?=.*[A-Z])))|(?=.*[a-z])(?=.*[A-Z])/
// 表示题目所有条件
let reg = /((?=.*\d)((?=.*[a-z])|(?=.*[A-Z])))|(?=.*[a-z])(?=.*[A-Z])^[a-zA-Z\d]{6,12}$/
console.log(reg.test('123456')) // false
console.log(reg.test('aaaaaa')) // false
console.log(reg.test('AAAAAAA')) // false
console.log(reg.test('1a1a1a')) // true
console.log(reg.test('1A1A1A')) // true
console.log(reg.test('aAaAaA')) // true
console.log(reg.test('1aA1aA1aA')) // true
2. Сопоставление строк — это так просто
две нечеткие спички
Обычный если есть только точное совпадение, то совершенно бессмысленно
горизонтальный
Длина регулярной сопоставляемой строки не фиксирована и может быть в различных ситуациях.Через квантификаторы +, *, ?, {m,n} может быть достигнуто горизонтальное сопоставление
let reg = /ab{2,5}c/g
let str = 'abc abbc abbbc abbbbc abbbbbc abbbbbbc'
str.match(reg) // [ 'abbc', 'abbbc', 'abbbbc', 'abbbbbc' ]
портрет
Обычная совпадающая строка, когда она специфична для определенного символа, может не быть определенной строкой, может быть много возможностей, а метод реализации - это группа символов (на самом деле, множественные ветки выбора | также могут быть реализованы)
let reg = /a[123]b/g
let str = 'a0b a1b a2b a3b a4b'
str.match(reg) // [ 'a1b', 'a2b', 'a3b' ]
группа символов
Не обманывайтесь названием, хотя оно называется группой символов, на самом деле это просто возможность представить персонажа.
обозначение диапазона
[123456abcdefABCDEF] => [1-6a-fA-F]
Исключить группы символов
Символ может быть любым, но это не может быть xxx, используйте символ ^
Вопрос: Как изобразить что-либо, кроме слова?
[^abc]
общие сокращения
\d // 数字
\D // 非数字
\w // [0-9a-zA-Z_]
\W // [^0-9a-zA-Z_]
\s // [\t\v\n\r\f]
\S // [^\t\v\n\r\f]
.
квантификатор
Квантификаторы и сокращения
1. {m,} // 至少出现m次
2. {m} // 出现m次
3. ? // 出现0次或者1次,等价于{0,1}
4. + // 至少出现1次,等价于{1,}
5. * // 出现人一次,等价于{0,}
Жадное сопоставление против ленивого сопоставления
Обычный сам по себе является жадным и будет соответствовать как можно большему количеству символов, соответствующих шаблону.
let regex = /\d{2,5}/g
let string = '123 1234 12345 123456'
// 贪婪匹配
// string.match(regex) // [ 123, 1234, 12345, 12345 ]
// 惰性匹配
let regex2 = /\d{2,5}?/g
// string.match(regex) // [ 12, 12, 34, 12, 34, 12, 34, 56 ]
Добавить единицу после квантификатора? , который становится ленивым соответствием
贪婪量词 惰性量词
{m,n} {m,n}?
{m,} {m,}?
? ??
+ +?
* *?
Ветка с множественным выбором
Шаблон может обеспечить горизонтальное и вертикальное нечеткое сопоставление, а ветвь множественного выбора может поддерживать несколько подшаблонов для выбора одного, форма (p1|p2|p3)
let regex = /good|nice/g
let string = 'good idea, nice try.'
// string.match(regex) // [ 'good', 'nice' ]
// 注意,用/good|goodbye/去匹配'goodbye' 匹配到的是good
// 因为分支结构是惰性的,前面的匹配上了,后面的就不再尝试了
анализ случая
1. Идентификатор матча
// 1
let regex = /id=".*?"/ // 想想为什么要加? 不加的话 连后面的class都会匹配到
let string = '<div id="container" class="main"></div>';
console.log(string.match(regex)[0]);
// 2
let regex = /id="[^"]*"/
let string = '<div id="container" class="main"></div>';
console.log(string.match(regex)[0]);
2. Сопоставьте шестнадцатеричные значения цвета
// 要求匹配如下颜色
/*
#ffbbad
#Fc01DF
#FFF
#ffE
*/
let regex = /#([a-fA-F\d]{6}|[a-fA-F\d]{3})/g
let string = "#ffbbad #Fc01DF #FFF #ffE";
console.log(string.match(regex))
// ["#ffbbad", "#Fc01DF", "#FFF", "#ffE"]
3. Сопоставьте 24-часовое время
/*
要求匹配
23:59
02:07
*/
// 解析:
// 第一位:可以是0、1、2
// 第二位:当第一位位0或者1的时候,可以是0到9、第一位是2的时候,只可以是0到3
// 第三位:固定是冒号:
// 第四位:可以是0到5
// 第五位:0到9
let regex = /^([01]\d|2[0-3]):[0-5]\d$/
console.log(regex.test('23:59')) // true
console.log(regex.test('02:07'))// true
// 衍生题,可以是非0
let regex = /^(0?\d|1\d|2[0-3]):(0?|[1-5])\d/
console.log( regex.test("23:59") ) // true
console.log( regex.test("02:07") ) // true
console.log( regex.test("7:09") ) // true
4. Даты матчей
/*
要求匹配
yyyy-mm-dd格式的日期
注意月份、和日的匹配
*/
let regex = /\d{4}-(0\d|1[0-2])-(0[1-9]|[12]\d|3[01])/
console.log( regex.test("2017-06-10") ) // true
console.log( regex.test("2017-11-10") ) // true
3. Магия скобок
Роль круглых скобок состоит в том, чтобы обеспечить группировку (регулярность в круглых скобках - это целое, то есть обеспечить подвыражения), чтобы мы могли ссылаться на него.
группировка
Как заставить квантификаторы действовать на целое?
let reg = /(ab)+/g
let string = 'ababa abbb ababab'
console.log(string.match(reg)) // ["abab", "ab", "ababab"]
отраслевая структура
Структура ветвей немного похожа на концепцию в программировании ||
/*
匹配
I love JavaScript
I love Regular Expression
*/
let reg = /I love (JavaScript|Regular Expression)/
console.log(reg.test('I love JavaScript')) // true
console.log(reg.test('I love Regular Expression')) // true
сгруппированные ссылки
Создавайте подвыражения через круглые скобки, вы можете выполнять извлечение данных и мощные операции замены, а также вы можете обращаться к сгруппированному контенту через js.
Извлечь данные
/*
提取年月日
2021-08-14
*/
let reg = /(\d{4})-(\d{2})-(\d{2})/
console.log('2021-08-14'.match(reg))
// ["2021-08-14", "2021", "08", "14", index: 0, input: "2021-08-14", groups: undefined]
// 第二种解法,通过全局的$1...$9读取 引用的括号数据
let reg = /(\d{4})-(\d{2})-(\d{2})/
let string = '2021-08-14'
reg.test(string)
console.log(RegExp.$1) // 2021
console.log(RegExp.$2) // 08
console.log(RegExp.$3) // 14
замена данных
/*
将以下格式替换为mm/dd/yyy
2021-08-14
*/
// 第一种解法
let reg = /(\d{4})-(\d{2})-(\d{2})/
let string = '2021-08-14'
// 第一种写法
let result1 = string.replace(reg, '$2/$3/$1')
console.log(result1) // 08/14/2021
// 第二种写法
let result2 = string.replace(reg, () => {
return RegExp.$2 + '/' + RegExp.$3 + '/' + RegExp.$1
})
console.log(result2) // 08/14/2021
// 第三种写法
let result3 = string.replace(reg, ($0, $1, $2, $3) => {
return $2 + '/' + $3 + '/' + $1
})
console.log(result3) // 08/14/2021
обратные ссылки (важно)
Помимо ссылки на сгруппированный контент через js, вы также можете ссылаться на сгруппированный контент с помощью регулярных выражений.
/*
写一个正则支持以下三种格式
2016-06-12
2016/06/12
2016.06-12
*/
let regex = /(\d{4})([-/.])\d{2}\2\d{2}/
var string1 = "2017-06-12";
var string2 = "2017/06/12";
var string3 = "2017.06.12";
var string4 = "2016-06/12";
console.log( regex.test(string1) ); // true
console.log( regex.test(string2) ); // true
console.log( regex.test(string3) ); // true
console.log( regex.test(string4) ); // false
Уведомление
-
Что происходит со ссылкой на несуществующую группу?
- То есть совпадение само \1\2
-
Что произойдет, если после группировки будет квантификатор?
- Если после группировки есть квантификатор, окончательные данные, захваченные группировкой (обратите внимание на группировку, а не все), являются последним совпадением.
'12345'.match(/(\d)+/) // ["12345", "5", index: 0, input: "12345", groups: undefined]
/(\d)+ \1/.test('12345 1') // false
/(\d)+ \1/.test('12345 5') // true
незахватывающие круглые скобки
Скобки, использованные выше, будут соответствовать данным, которым они соответствуют, для последующей ссылки, поэтому это также можно назвать захватом группировки и захватом ветви.
Если вы хотите самую примитивную функцию скобок, но не будете ссылаться на нее, то есть не будет отображаться ни в справочнике по API, ни в обычном справочнике, вы можете использовать
Незахватывающие круглые скобки (?:p)
// 非捕获型引用
let reg = /(?:ab)+/g
console.log('ababa abbb ababab'.match(reg)) // ["abab", "ab", "ababab"]
// 注意这里,因为是非捕获型分组,所以使用match方法时,不会出现在数组的1位置了
let reg = /(?:ab)+/
console.log('ababa abbb ababab'.match(reg)) // ["abab", index: 0, input: "ababa abbb ababab", groups: undefined]
let reg = /(ab)+/
console.log('ababa abbb ababab'.match(reg)) // ["abab", "ab", index: 0, input: "ababa abbb ababab", groups: undefined]
кейс
1. Моделирование метода обрезки
// 1. 提取中间关键字符, 使用的分组引用
const trim1 = (str) => {
return str.replace(/^\s*(.*?)\s*$/, '$1')
}
// 2. 去掉开头和结尾的空字符
const trim2 = (str) => {
return str.replace(/^\s*|\s*$/g, '')
}
2. Сделайте первую букву каждого слова заглавной
Главное найти первую букву каждого слова
// my name is epeli
const titleize = (str) => {
return str.toLowerCase().replace(/(?:^|\s)\w/g, (c) => c.toUpperCase())
}
console.log(titleize('my name is epeli')) // My Name Is Epeli
// 拓展,横向转驼峰,例如base-act-tab => BaseActTab
'base-act-tab'.replace(/(?:^|-)(\w)/g, ($0, $1) => $1.toUpperCase()) // BaseActTab
3. Верблюжий чехол
// -moz-transform => MozTransform
const camelize = (str) => {
return str.replace(/[-_\s]+(\w)/g, (_, $1) => $1.toUpperCase())
}
console.log(camelize('-moz-transform')) // MozTransform
4. Средняя линия
// MozTransform => -moz-transform
const dasherize = (str) => {
return str.replace(/[A-Z]/g, ($0) => ('-' + $0).toLowerCase())
}
console.log(dasherize('MozTransform')) // -moz-transform
5. Экранирование и восстановление HTML
// html转义规则见https://blog.wpjam.com/m/character-entity/
const escapeHTML = (str) => {
const escapeChars = {
'<': 'lt',
'>': 'gt',
'"': 'quot',
''': '#39',
'&': 'amp'
}
let regexp = new RegExp(`[${Object.keys(escapeChars).join('')}]`, 'g') // 为了得到字符组[<>"'&]
return str.replace(regexp, (c) => `&${escapeChars[ c ]};`)
}
console.log( escapeHTML('<div>Blah blah blah</div>')) // <div>Blah blah blah</div>
// 反转义
const unescapseHTML = (str) => {
const htmlEntities = {
nbsp: ' ',
lt: '<',
gt: '>',
quot: '"',
amp: '&',
apos: '''
}
return str.replace(/&([^;]+);/g, ($0, $1) => {
return htmlEntities[ $1 ] || ''
})
}
console.log(unescapseHTML('<div>Blah blah blah</div>')) // <div>Blah blah blah</div>
6. Сопоставьте пары тегов
/*
匹配
<title>regular expression</title>
<p>laoyao bye bye</p>
不匹配
<title>wrong!</p>
*/
let reg = /<([^>]+)>.*?</\1>/g
console.log(reg.test('<title>regular expression</title>')) // true
console.log(reg.test('<p>laoyao bye bye</div>')) // false
увидимся снова
настоятельно рекомендуетсяЛао ЯоизМини-книга по регулярным выражениям,автор тоже потихоньку стал понимать закономерность после прочтения этой книги,и уже не сопротивлялся ей.Эта статья в основном основана на содержании этой книги.
«Добро пожаловать для обсуждения в области комментариев, официальный представитель NuggetsПроект «Звезда раскопок»После мероприятия в комментариях будет разыграно 100 штук Наггетсов.Подробнее о лотерее читайте в статье о мероприятии».