Заметки сделаны 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
найдены совпадения с 'The
se are
som
e pho
ne 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 somephone
numbe
915-555-1234..." Действительно, наш шаблон очень простой, он находит только последовательность из 5 букв подряд подряд. Так улучшите это сейчас -
\w{5}\s
Чтобы иметь возможность находить слова, так что я надеюсь, что после 5 букв, за которыми следует последовательность пробелов, это должно быть в порядке, посмотрите на совпадающую ситуацию: 'These
are somephone
numbers
915-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 Специальный синтаксис для []
Только что были введены самые простые и основные функции, но есть несколько особых моментов, на которые стоит обратить внимание.
- - когда коннектор является первым символом
Например[-.]
означает дефис-
или запись через точку.
. Однако, если дефис не является первым символом, например[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+\.
- затем
com
net
илиedu
\w+@\w+\.(com|net|edu)
Не забудьте обратить внимание на четвертый шаг\.
побег символ
Ну, это может соответствовать всем вышеперечисленным почтовым ящикам. Но проблема все же есть, потому что имя пользователя почтового ящика может иметь.
, подобноvincent.ko@126.com
Это на самом деле все еще довольно просто, исправление выглядит следующим образом:[\w.]+@\w+\.(com|net|edu)
1.2.5. Резюме
-
[]
Роль , выраженная в английском языке, - это «чередование», выражающее логику или; -
/[-.(]/
дефис в символе-
Размещение на первом месте означает сам дефис, если поставить в середине, это означает «от .. до ..», например.[a-z]
означает а-я -
[.)]
Спецсимволы в скобках экранировать не нужно, они представляют сами себя -
[^ab]
в скобках^
значит нет ничего кромеa
andb
-
(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
является наиболее мощным методом.При использовании функции обратного вызова возвращаемое значение является значением замены, параметры匹配值
group1
group2
...