Как, черт возьми, я их решаю?
Как и любая новая вещь:
10 Study
20 Practice
30 goto 10
Учиться
Я считаю, что большинство успешных учителей начинают преподавать любой предмет, сначала предоставив немного фона для предмета. Важно иметь контекст того, что вы изучаете, и, самое главное, почему вы изучаете это.
Это все соответствие строк
Регулярные выражения являются средством сопоставления шаблонов в тексте. Это декларативный язык, сам по себе встроенный во множество других языков программирования.
Я хотел бы подчеркнуть, что это декларативный язык, регулярные выражения полезны для выражения того, с какой строкой соответствовать, но они никоим образом не отражают, как программа должна выполнять сопоставление. По этой причине можно использовать очень быстрые и очень медленные регулярные выражения в одном и том же языке программирования, просто используя другой анализатор RegEx.
Причина создания регулярных выражений одинакова для большинства языков программирования: программисты снова и снова решали одну и ту же сложную задачу и решили, что им нужен более простой способ написания кода.
Некоторые будут (и должны) жаловаться на мое предыдущее предложение, говоря что-то вроде:
RegEx не делает программу проще.
Это верно
RegEx не делает программу проще, RegEx упрощает написание программы. Вы все еще должны быть тщательными в своем тестировании, чтобы убедиться, что все правильные случаи совпадают правильно, а все неправильные случаи нет. Действительно сложно проверить «все», а со сложными шаблонами действительно сложно проверить «большинство». В худшем случае, вы все равно должны тестировать «некоторые» случаи.
Давайте включим несколько примеров, которые я в обязательном порядке выбрал для JavaScript движка RegEx, потому что я могу легко протестировать его вживую в браузере и потому, что мне не придется выполнять экранирование строк при использовании литералов RegEx.
Когда вы делаете нормальное сопоставление строк, вы проверяете одно строковое значение против другого. Они могут приходить откуда угодно, но в итоге нужно сравнить две строки друг с другом:
if ( 'foo' == 'bar' ) doSomething();
Этот пример - отстой, потому что он никогда ничего не сделает
if ( foo == 'bar' ) doSomething();
Намного лучше; сейчас мы заранее не знаем, будет ли что-то сделано или нет. Теперь мы можем начать принимать пользовательский ввод:
if ( prompt( 'Say "bar" to do something.' ) == 'bar' ) doSomething();
Замечательно, что теперь пользователи могут вводить, bar
и что-то будет происходить, пока вы не получите отчеты об ошибках от пользователей, говорящих, что "bar"
это не работает, или что «BAR» не работает, или что они набрали BRA
100 раз, и ничего не происходит.
Не обращая внимания на орфографические ошибки и лишние символы, 'bar' != 'BAR'
программистам необходимо придумать способ проверки того, где символы являются неправильным регистром.
Простое решение, используйте toLowerCase
. Это прекрасно работает, но как насчет наших пользователей, которые используют британский английский вместо американского английского, когда вы подходите something == 'color'
? Теперь вы должны соответствовать something == 'color' || somthing == 'colour'
.
Короче говоря, простые шаблоны очень быстро превращаются во множество повторяющегося кода.
Пример цвета можно просто сопоставить с:
/colou?r/.test( something )
глубокое понимание основ регулярных выражений может значительно сократить время, затрачиваемое на повторное изобретение колеса.
Где учиться
Большинство языков, которые реализуют регулярные выражения, имеют по крайней мере один ресурс, доступный для определенного синтаксиса использования регулярных выражений в этом языке. Один для JavaScript можно найти на MDN
прочитай это.
все это.
затем прочитайте это снова.
Это требует времени, чтобы учиться, думать об этом как об инвестициях: час на изучение RegEx теперь экономит час, когда в следующий раз вам нужно будет выполнить какое-либо сопоставление с образцом строки, а затем еще час - в следующий раз после этого.
практика
Прочитав все о RegEx, вы, вероятно, не поймете большинство из них. Это потому, что вы на самом деле ничего с этим не делаете .
Я упомянул, почему я выбрал JS для этого примера, я призываю вас возиться с этим в вашем браузере. Это быстро, и вы можете сделать это прямо в вашей строке URL.
У JS есть несколько разных и простых способов использования RegEx:
string.match( regex )
regex.exec( string )
regex.test( string )
Начиная с чего-то простого, например:
javascript:'color'.match(/colou?r/);
это простой способ проникнуть в дверь. Поиграй с этим, разбей его, посмотри, что соответствует, а что нет.
Когда вы застряли на практике, продолжайте 30
. Вы должны читать, чтобы узнать больше, но вы должны практиковаться, чтобы действительно понять то, что вы узнали.