Вероятно, лучший учебник по регулярным выражениям...

внешний интерфейс JavaScript регулярное выражение

Заметки сделаны YouTube@The Coding TrainУчитель публикует серию руководств. Потому что я сам читал ее много раз, но вскоре забыл. Поэтому, чтобы полностью понять, делать заметки во время учебы и делать заметки, читая лекции другим, я буду больше впечатлен собой, поэтому у меня есть следующее содержание. Путь продвижения Сяобая будет постоянно обновляться на его личном github:Портал, приветственная звезда

Осенний набор и серия интервью:

1. Приключения осеннего набора ВКонтакте (1)

2. Приключения осеннего набора ВКонтакте (2)

3. Приключения осеннего набора ВКонтакте (3)

4. Приключения осеннего набора ВКонтакте (4)

5. Дополнительная часть: предварительное собеседование и алгоритм письменного тестирования Алгоритм


регулярное выражение

1.1 Основной синтаксис

Обзор основ регулярных выражений с помощью схемы

single char квантификаторы (количество) позиция
\d соответствует цифрам * 0 или больше ^ начало строки
\w соответствует слову (цифры, буквы) + 1 и более, минимум 1 $ конец строки
\W соответствуетНетслово (число, буква) 0 или 1, необязательный \b слово "границы"
\s соответствует пустому пространству (включая пробелы, вкладки и т. д.) {min,max} встречается в диапазоне
\S соответствуетНетпустое пространство (включая пробелы, вкладки и т. д.) {n} соответствует n вхождениям
.соответствует любому, любому символу

1.1.1. single char

Предположим, у вас есть сегмент символов следующим образом:

字符

  • \w

будут соответствовать всем словам, кроме конечно () - и т.д.

  • \w\w\w

найдены совпадения с 'These are some phone numberс...' Обратите внимание, что регулярные выражения — это правила, сопоставляющие непрерывную строку, поэтому вы можете видеть, что могут сопоставляться слова из трех букв, а также слова из шести слов.

  • \s\s

Соответствует двум последовательным пробелам в строке

quantifiers

Предположим, у нас есть этот отрывок:

The colors of the rainbow have many colours 
and the rainbow does not  have a single colour.

Мы хотим найти все цветаcolors colours colour

Отвечать colou?rs?Ну, это выглядит просто и удобно.


Ну, теперь вы хотите сопоставить 4 числа в строке, или 5 букв в строке и т. д. В это время очень удобно использовать квантификаторы.

Я сейчас пытаюсь найти слова из 5 букв

  • \w{5}Это нормально? Ну... нет, посмотрите на содержимое, которому оно соответствует, а именно: 'These are some phone numbe915-555-1234..." Действительно, наш шаблон очень простой, он находит только последовательность из 5 букв подряд подряд. Так улучшите это сейчас

  • \w{5}\sЧтобы иметь возможность находить слова, так что я надеюсь, что после 5 букв, за которыми следует последовательность пробелов, это должно быть в порядке, посмотрите на совпадающую ситуацию: 'Theseare some phonenumbers915-555-1234..." Ну да, только нынешними методами это не сделать. Итак, нам нужен третий инструмент «позиция»

1.1.2. position

Прежде чем вернуться к предыдущему вопросу, ознакомьтесь с^ $а также\b

This is somthing
is about
a blah
words
sequence of words
Hello and
GoodBye and 
Go gogo!

Давайте посмотрим, чему соответствуют различные закономерности.

  • \w+Это должно, без сомнения, соответствовать всем словам

  • ^\w+один дополнительный^, таким образом, могут быть сопоставлены только слова в начале каждой строкиThis is a words sequence Hello GoodBye Go

  • \w+$Это будет соответствовать последней букве каждой строки

Вернуться к предыдущему вопросу

Теперь ищем слова из 5 букв.

Это становится очень просто, используйте слово чары\b

ответ\b\w{5}\b

1.1.3. Найдите номер телефона

Наконец, найдите номер телефона, который только что появился123-456-1231

Самый простой метод регуляризации выше:\d{3}-\d{3}-\d{4}, и нашел его. Но иногда номер телефона123.456.1234или(212)867-4233Что насчет структуры?

в регулярном выраженииИли другие выражения, которые будут представлены по одному ниже.

1.2 Классификация символов (класс char)

Самые основные методы были записаны ранее, а потом поговорим о классификаторе[]

Этот символ используется для обозначения логической связи,Например[abc]означает a или b или c.[-.]подписать-или.Нет(Обратите внимание здесь, в[]середина.Символ представляет этот символ, но если он находится за его пределами, значит, он соответствует всем. так что если нет[]Среди них, если вы хотите сопоставить '.', вам нужно передать escape-символ\.)

1.2.1 Простое применение классификации

Последовательность символов:

The lynk is quite a link don't you think? l nk l(nk

Регулярное выражение:l[yi (]nk

результат:

lynk  link  l nk   l(nk

Легко понять, что выражениелогика.

1.2.2 Сопоставьте все возможные телефонные номера

Хорошо, теперь вернемся к старому вопросу, есть следующие поля, пожалуйста, сопоставьте все возможные номера телефонов:

These are some phone numbers 915-134-3122. Also,
you can call me at 643.123.1333 and of course,
I'm always reachable at (212)867-5509

хорошо, шаг за шагом, только что мы использовали\d{3}-\d{3}-\d{4}Случай, когда дефис совпадает. Теперь мы можем легко.Это добавлено

первый шаг:\d{3}[-.]\d{3}[-.]\d{4}

Шаг 2: Чтобы иметь возможность сопоставлять круглые скобки, вы можете использовать ?, потому что это выбор опции. Так в итоге стало

\(?\d{3}[-.)]\d{3}[-.]\d{4}

Здесь еще необходимо пояснить, что в [] специальные символы не нужно экранировать и их можно использовать напрямую, например[.()], но снаружи его нужно сбежать\( \.Ждать

1.2.3 Специальный синтаксис для []

Только что были введены самые простые и основные функции, но есть несколько особых моментов, на которые стоит обратить внимание.

  1. - когда коннектор является первым символом

Например[-.]означает дефис-или запись через точку.. Однако, если дефис не является первым символом, например[a-z], что означает от буквы a до символа z.

  1. ^ в []

^В предыдущем введении оно означало начало строки, а в[], имеют разное значение.[ab]означает а или б[^ab]Подойдет что угодно, если только это не a или b (что угодно, кроме a и b), что эквивалентно отрицанию.

1.2.4. [] и ()

Помимо использования[]средства или логика,()это тоже хорошо. использование(a|b)означает а или б

Например, следующий пример соответствует всем электронным письмам

gaoyaqi411@126.com  
dyumc@google.net 
sam@sjtu.edu

Идеи:

Прежде всего, подумайте, что именно я совмещаю, вот я хочу совместить

  1. Любой, начинающийся со слов, одного или нескольких\w+
  2. за которым следует@символ\w+@
  3. за которым следует одно или несколько слов\w+@\w+
  4. затем.пунктуация\w+@\w+\.
  5. затемcom netилиedu \w+@\w+\.(com|net|edu)

Не забудьте обратить внимание на четвертый шаг\.побег символ

Ну, это может соответствовать всем вышеперечисленным почтовым ящикам. Но проблема все же есть, потому что имя пользователя почтового ящика может иметь., подобноvincent.ko@126.com

Это на самом деле все еще довольно просто, исправление выглядит следующим образом:[\w.]+@\w+\.(com|net|edu)

1.2.5. Резюме

  1. []Роль , выраженная в английском языке, - это «чередование», выражающее логику или;
  2. /[-.(]/дефис в символе-Размещение на первом месте означает сам дефис, если поставить в середине, это означает «от .. до ..», например.[a-z]означает а-я
  3. [.)]Спецсимволы в скобках экранировать не нужно, они представляют сами себя
  4. [^ab]в скобках^значит нет ничего кромеa and b
  5. (a|b)Может также представлять отбор, но у него больше силы....

так,()В чем заключается мощная функция? Захват пакетов, который очень полезен для замены и обмена последовательностями. Учебные записи в следующем разделе

1.3. Группы захвата

Что такое захват пакетов, а теперь вернемся к предыдущему примеру с телефонными номерами.

212-555-1234
915-412-1333

//我想要保留区号,把后面的电话号码变为通用性的
👇👇👇👇👇👇👇👇👇👇👇👇

212-xxx-xxxx
915-xxx-xxxx

как прежде\d{3}-\d{3}-\d{4}, Этот метод сопоставления заключается в сопоставлении всего номера телефона как группы (группы). мы кладем212-555-1234такой звонокGroup0.

На этот раз, если мы добавим скобку\d{3}-(\d{3})-\d{4}, то соответствие555просто позвониGroup1. И так далее, если есть две скобки\d{3}-(\d{3})-(\d{4})Тогда группировка выглядит следующим образом:

212-555-1234   Group0
555            Group1
1234           Group2

1.3.1. Выберите группу

Теперь, когда группа разделена, как выбрать подходящую группу?

Здесь есть два метода, первый использует$символы, такие как$1представлять555,$2представлять1234; во-вторых, используйте\,Например\1представлять555. Два сценария использования разные, давайте сначала поговорим об этом$

Теперь, чтобы удовлетворить первоначальные требования, мы можем сделать

reg: \(?(\d{3})[-.)]\d{3}[-.]\d{4}

replace: $1-xxx-xxxx

ps: здесь вы можете напрямую использовать функцию замены JS для работы, но обычная функция не является эксклюзивной для JS, поэтому здесь приведен общий метод, а затем резюмируется часть JS.

1.3.2 Обучение в реальных условиях

  1. Теперь есть список списков, но имя и фамилия поменялись местами, и мне нужно поменять его местами.
shiffina, Daniel
shifafl, Daniell
shquer, Danny
...

Реализация:

reg: (\w+),\s(\w+)

replace: $2 $1

Уведомление:$0все совпадения, поэтому первое в скобках$1

  1. Сопоставьте тег ссылки в уценке и замените его тегом html.
[google](http://google.com)
[itp](http://itp.nyu.edu)
[Coding Rainbow](http://codingrainbow.com)

Анализ. В этом вопросе есть несколько подводных камней, и его нужно решать медленно.

Увидев это, первый хочет рассмотреть соответствие[google]Эта штука, сразу подумайте о регулярных выражениях\[.*\]. Это огромная яма, и в настоящее время она действительно может правильно соответствовать трем вышеперечисленным. Но если текст такой:

字符匹配

Видите, содержимое первой строки совпадет, но не различимо.[google]а также[test]. Поэтому,Потому что.жадный, он имеет в виду все, все, что может быть сопоставлено, поэтому, конечно, он также включает в себя], до последней строки], он просто останавливается.

Таким образом, для правильного сопоставления это жадное свойство необходимо удалить. используется здесь. когда?помещатьquantifiersПосле символа это означает, что жадный атрибут удален, и условие завершения соответствует остановке.

\[.*?\]Таким образом, вы можете[google]а также[test]В разобранном виде эффект следующий:

分割

Далее все завершаем:

reg: \[(.*?)\]\((http.*?)\)

replace: <a href="$2">$1</a>

1.3.3 Использование\Селектор

$Селектор — это флаг или выделение при замене, но если он есть в самом регулярном выражении, то необходимо использовать\выбран. Например следующий сценарий

This is is a a dog , I think think this is is really
a a good good dog. Don't you you thinks so so ?

Мы хотим сопоставить, например.is is so soДля такой непрерывной последовательности используется следующее выражение:(\w+)\s\1

Эффект:

效果图

Ну почти эффект, но есть небольшие баги. как первое предложениеThis is is aЭто неточное совпадение, и будут совпадать буквы после первой This.При этом используется зачарование персонажа, упомянутое в первом разделе.\bохватывать, это становится\b(\w+)\s\1\b

Ладно, все готово, я не буду выкладывать рендеры, просто решайте сами.

1.3.4. Резюме

  1. Групповой захват, используйте () для группировки данных, номер 0 представляет полное совпадение, а выбранная группа начинается с номера 1
  2. можно использовать селектор$1а также\1, но сценарии использования разные,\Используется в самих регулярных выражениях
  3. ?символ может отключить жадное свойство, поставить.*После этого это означает, что матч может остановиться, когда он встретит ключевую точку. В противном случае он всегда будет соответствовать обратному.

1.4 Приложение на JavaScript

В js основные регулярные выражения связаны со строковыми приложениями.

var str = "hello"
var r = /w+/

Эти два метода являются буквальными методами создания строк и reg соответственно. Если вы хотите использовать регулярность для работы, используйтеr.test()а такжеstr.match()так же какstr.replaceи другие методы.

1.4.1. reg.test()

Само регулярное выражение имеет тестовый метод, который может только проверять включение и возвращает логическую переменную.

var r = /\d{3}/;
var a = '123';
var b = '123ABC';
var c = 'abc';

r.test(a)  //true
r.test(b) //true
r.test(c) //false

Что ж, это очень просто и используется нечасто.Далее основное внимание уделяется некоторым методам на ул.

1.4.2. str.match()

В отличие от test(), вместо того, чтобы просто возвращать логическую переменную, она возвращает все, что вы сопоставили.

var r = /compus/
var reg = /w+/
var s = "compus, I know something about you"
r.test(s)  //true
s.match(r)  //["compus"]
s.match(reg) //["compus"]

Подождите, похоже, проблема, почему последняя возвращается еще и "компьюс"? Это ненаучно.

На самом деле, match() возвращает первую последовательность, с которой можно сопоставиться. Для достижения предыдущего эффекта нужно использовать несколько флагов о регулярности в JS

1.4.2.1. flag

Этот признак необходим при установлении регулярности, в основном их три.

flag имея в виду
g все, подбери все для меня
i игнорировать регистр
m многострочное совпадение

Итак, чтобы решить проблему прямо сейчас, просто установите reg вот так.

var reg = /w+/g

см. следующее упражнение

var str = "Here is a Phone Number 111-2313 and 133-2311"

var r = /\d{3}[-.]\d{4}/
var rg = /\d{3}[-.]d{4}/g

console.log(str.match(r)); //["111-2313"]
console.log(str.match(rg));//["111-2313","133-2311"]

Ну ищет номер телефона, да, это очень удобно. Но есть еще один вопрос, группировка, упомянутая ранее, будет соответствовать группировке?

var sr = /(\d{3})[-.]\d{4}/
var srg = /(\d{3})[-.]\d{4}/g

console.log(str.match(sr)); //["111-2313","111"]
console.log(str.match(srg)); //["111-2313","133-2311"]

Итак, вывод: когда используется глобальный флагg, будет возвращена не группировка, а все совпадающие результаты; если не используетсяg, совпавшие результаты и группы будут возвращены в виде массива.

Итак, как добиться глобальной группировки?

1.4.3. reg.exec()

Буквально метод выполнения регулярных выражений. Этот метод может реализовать глобальное сопоставление и возвращать сгруппированные результаты.

Каждый раз, когда вызывается reg.exec(), возвращается совпадающий результат.Совпадающий результат и группировка возвращаются в виде массива, и следующий результат может быть возвращен путем непрерывного вызова до тех пор, пока он не вернется.null

var str = "Here is a Phone Number 111-2313 and 133-2311" ;
var srg = /(\d{3})[-.]\d{4}/g;
var result = srg.exec(str);
while(result !== null) {
    console.log(result);
    result = srg.exec(str);
}

Результат может содержать больше содержимого, чем ожидалось.Это массив.Например, для первого выполнения его результат:

["133-2311", "133", index: 36, 
input: "Here is a Phone Number 111-2313 and 133-2311" groups: undefined]

1.4.4. str.split

Теперь мы подошли к более сильной функции.Давайте сначала поговорим о разбиении.Мы знаем, что разбиение - это разделение строки по определенному символу.Например,если есть следующий абзац,его нужно разбить на слова.

var s = "unicorns and rainbows And, Cupcakes"

Разделить на слова, первое, что приходит в голову, это разделить пробелами, поэтому добиться этого можно следующим образом

var result = s.split(' ');
var result1 = s.split(/\s/);
//完全一样的效果
//["unicorns", "and", "rainbows", "And,", "Cupcakes"]

Ну, это не отражает силу регулярности, и самое главное, что нет требования к реализации. Потому что есть еще и "И". Так что используйте обычный, условие соответствия逗号或者空格

result = s.split(/[,\s]/);

//["unicorns", "and", "rainbows", "And", "", "Cupcakes"]

Результат все равно отличается от того, что нужно, потому что есть лишний "". Мы не хотим, чтобы он был разделен на основе逗号或者空格, который должен быть основан на逗号或空格所在的连续序列. добавить один к оригиналу+, изменился на/[,\s]+/, что значит一个单独的逗号,或者一个单独的空格

result = s.split(/[,\s]+/);
// ["unicorns", "and", "rainbows", "And", "Cupcakes"]

1.4.4.1 Сегментация слов

Что ж, расширьте его, чтобы добиться сегментации слов в абзаце, регулярное выражение

result = s.split(/[,.!?\s]+/)

Конечно, есть самый простой способ, мы можем сделать это

result = s.split(/\W+/);

Далее, если мы хотим разделить предложения абзаца, выражение, которое можно реализовать, это

result = s.split(/[.,!?]+/)

Наконец, есть небольшое требование, то есть при разделении предложений мы также хотим сохранить соответствующие разделители.

var s = 
"Hello,My name is Vincent. Nice to Meet you!What's your name? Haha."

Это маленький понит, помнитеЕсли вы хотите сохранить разделитель, просто сгруппируйте совпадения

var result = s.split(/([.,!?]+)/)
//["Hello", ",", "My name is Vincent", ".", " Nice to Meet you", "!", "What's your name", "?", " Haha", ".", ""]

Как видите, это также сохранит разделитель.

1.4.5. str.replace()

replace также является методом строк, его основное использованиеstr.replace(reg,replace|function), первый параметр — это регулярное выражение, представляющее совпадающее содержимое, а второй параметр — это строка замены или возвращаемая функция.

Обратите внимание, что replace не изменяет исходную строку, она просто возвращает измененную строку, кроме того, если не используется регулярное выражениеgзнак, а такжеmatchто же самое, только соответствует/заменяет первый

1.4.5.1 Простейшая замена

Замените гласные (aeiou) в последовательности на двойную. Например х->хх

var s = "Hello,My name is Vincent."
var result = s.replace(/([aeiou])/g,"$1$1")
//"Heelloo,My naamee iis Viinceent."

Обратите внимание, что вторым параметром должна быть строка; будьте внимательны, не забудьте добавитьg

1.4.5.2 Параметры функции Niu x coax приближаются

Ну, это самое мощное место.Второй параметр передается в функцию.Сначала рассмотрим самый простой пример.

var s = "Hello,My name is Vincent. What is your name?"
var newStr = s.replace(/\b\w{4}\b/g,replacer)
console.log(newStr)
function replacer(match) {
    console.log(match);
    return match.toUpperCase();
}
/*
name
What
your
name
Hello,My NAME is Vincent. WHAT is YOUR NAME?
*/

Таким образом, параметром функции является совпадающий контент, а возвращаемый контент — это контент, который необходимо заменить. Хорошо, базовый пример объясняет основное использование, а как насчет группировки, обсуждавшейся ранее? Как добиться группировки?

//分组

function replacer(match,group1,group2) {
    console.log(group1);
    console.log(group2);
}

Если регулярное выражение обрабатывается в группах, то в функции обратного вызова во-вторых и третий параметры функции являются Group1, Group2. Вы можете сделать это много удивительных вещей

1.4.5.3 Общие практические вопросы

  1. Определите символ с наибольшим количеством вхождений в строке и подсчитайте количество раз
var s = 'aaabbbcccaaabbbaaa';
var a = s.split('').sort().join("");  //"aaaaaaaaabbbbbbccc"
var ans = a.match(/(\w)\1+/g);
ans.sort(function(a,b) {
    return a.length - b.length;
})
console.log('ans is : ' + ans[ans.length-1])

1.4.6 Резюме

  1. В js литералы регулярных выражений/reg/и строковые литералы"str"Используется для создания регулярных выражений и строк. Есть два метода на обычномreg.test()а такжеreg.exec()
  2. reg.test(str)метод, который возвращает логическую переменную, чтобы указать, есть ли совпадение;reg.exec(str)Несколько похоже на итераторы, каждый раз, когда он выполняется, он возвращает совпадающий результат и группировку, пока не вернется какnullконец.
  3. Строковые методы в основномstr.match(reg),str.split(reg)а такжеstr.replace(reg,str|function)три метода.
  4. matchБолее особенным, если регулярка содержит группировку, а неgфлаг, возвращает совпадающий контент и группировку; если группировка отсутствует, а естьgфлаг, вернуть все совпадения
  5. splitЭтот метод в основном используется для сегментации строк. Если вы хотите сохранить разделитель, не забудьте сгруппировать соответствующий контент (заключите его в круглые скобки).
  6. replaceявляется наиболее мощным методом.При использовании функции обратного вызова возвращаемое значение является значением замены, параметры匹配值 group1 group2...