Заметки сделаны 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}Это нормально? Ну... нет, посмотрите на содержимое, которому оно соответствует, а именно: 'Theseare somephonenumbe915-555-1234..." Действительно, наш шаблон очень простой, он находит только последовательность из 5 букв подряд подряд. Так улучшите это сейчас -
\w{5}\sЧтобы иметь возможность находить слова, так что я надеюсь, что после 5 букв, за которыми следует последовательность пробелов, это должно быть в порядке, посмотрите на совпадающую ситуацию: 'Theseare somephonenumbers915-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+один дополнительный^, таким образом, могут быть сопоставлены только слова в начале каждой строкиThisisawordssequenceHelloGoodByeGo -
\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 Специальный синтаксис для []
Только что были введены самые простые и основные функции, но есть несколько особых моментов, на которые стоит обратить внимание.
- - когда коннектор является первым символом
Например[-.]означает дефис-или запись через точку.. Однако, если дефис не является первым символом, например[a-z], что означает от буквы a до символа z.
- ^ в []
^В предыдущем введении оно означало начало строки, а в[], имеют разное значение.[ab]означает а или б[^ab]Подойдет что угодно, если только это не a или b (что угодно, кроме a и b), что эквивалентно отрицанию.
1.2.4. [] и ()
Помимо использования[]средства или логика,()это тоже хорошо. использование(a|b)означает а или б
Например, следующий пример соответствует всем электронным письмам
gaoyaqi411@126.com
dyumc@google.net
sam@sjtu.edu
Идеи:
Прежде всего, подумайте, что именно я совмещаю, вот я хочу совместить
- Любой, начинающийся со слов, одного или нескольких
\w+ - за которым следует
@символ\w+@ - за которым следует одно или несколько слов
\w+@\w+ - затем
.пунктуация\w+@\w+\. - затем
comnetилиedu\w+@\w+\.(com|net|edu)
Не забудьте обратить внимание на четвертый шаг\.побег символ
Ну, это может соответствовать всем вышеперечисленным почтовым ящикам. Но проблема все же есть, потому что имя пользователя почтового ящика может иметь., подобноvincent.ko@126.com
Это на самом деле все еще довольно просто, исправление выглядит следующим образом:[\w.]+@\w+\.(com|net|edu)
1.2.5. Резюме
-
[]Роль , выраженная в английском языке, - это «чередование», выражающее логику или; -
/[-.(]/дефис в символе-Размещение на первом месте означает сам дефис, если поставить в середине, это означает «от .. до ..», например.[a-z]означает а-я -
[.)]Спецсимволы в скобках экранировать не нужно, они представляют сами себя -
[^ab]в скобках^значит нет ничего кромеaandb -
(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 Обучение в реальных условиях
- Теперь есть список списков, но имя и фамилия поменялись местами, и мне нужно поменять его местами.
shiffina, Daniel
shifafl, Daniell
shquer, Danny
...
Реализация:
reg: (\w+),\s(\w+)
replace: $2 $1
Уведомление:$0все совпадения, поэтому первое в скобках$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. Резюме
- Групповой захват, используйте () для группировки данных, номер 0 представляет полное совпадение, а выбранная группа начинается с номера 1
- можно использовать селектор
$1а также\1, но сценарии использования разные,\Используется в самих регулярных выражениях -
?символ может отключить жадное свойство, поставить.*После этого это означает, что матч может остановиться, когда он встретит ключевую точку. В противном случае он всегда будет соответствовать обратному.
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 Общие практические вопросы
- Определите символ с наибольшим количеством вхождений в строке и подсчитайте количество раз
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 Резюме
- В js литералы регулярных выражений
/reg/и строковые литералы"str"Используется для создания регулярных выражений и строк. Есть два метода на обычномreg.test()а такжеreg.exec() -
reg.test(str)метод, который возвращает логическую переменную, чтобы указать, есть ли совпадение;reg.exec(str)Несколько похоже на итераторы, каждый раз, когда он выполняется, он возвращает совпадающий результат и группировку, пока не вернется какnullконец. - Строковые методы в основном
str.match(reg),str.split(reg)а такжеstr.replace(reg,str|function)три метода. -
matchБолее особенным, если регулярка содержит группировку, а неgфлаг, возвращает совпадающий контент и группировку; если группировка отсутствует, а естьgфлаг, вернуть все совпадения -
splitЭтот метод в основном используется для сегментации строк. Если вы хотите сохранить разделитель, не забудьте сгруппировать соответствующий контент (заключите его в круглые скобки). -
replaceявляется наиболее мощным методом.При использовании функции обратного вызова возвращаемое значение является значением замены, параметры匹配值group1group2...