Пишите код сознательно и выбирайте подходящий инструмент для работы
JavaScript предлагает нам несколько методов проверки строк на наличие шаблонов, в первую очередь для объектов RegExp
и String
. Эта статья призвана выделить два метода, которые, как я вижу, используются для проверки строк на наличие шаблонов, как они могут быть использованы не по назначению и как их можно использовать надлежащим образом.
Предполагается, что вы понимаете, что такое регулярные выражения, как определять их значение и когда их целесообразно использовать.
Проблема: Напишите функцию, которая принимает строку и шаблон в качестве входных данных и печатает «Образец найден», если образец найден в строке, и «Образец не найден» в противном случае.
Несмотря на то, что замаскировано простотой и, возможно, даже тривиальностью, разработчики часто сталкиваются с проблемами, аналогичными этой - проблемой, при которой мы должны проверить, содержит ли строка определенный шаблон, и написать код, который выполняет одно действие, когда шаблон найден, и предпринимает другие действия, когда узор отсутствует в строке. Мы сталкиваемся с этой проблемой так часто, что разрабатываем решение, готовое к немедленному извлечению из нашего левого полушария.
Если вы пишете JavaScript и сталкиваетесь с этой проблемой, подумайте, какое из приведенных ниже решений вы, скорее всего, напишете. Оба решения дают одинаковые результаты во всех случаях, но я предполагаю, что одно лучше другого для этой проблемы.
Решение №1
function testStrForPattern(str, pattern) { if (str.match(pattern)) { return console.log("Pattern Found"); } return console.log("Pattern Not Found"); } const sentence = "We write JavaScript code for people!"; testStrForPattern(sentence, /javascript|code/i); // Output: "Pattern Found" testStrForPattern(sentence, /php|web/i); // Output: "Pattern Not Found"
Решение №2
function testStrForPattern(str, pattern) { if (pattern.test(str)) { return console.log("Pattern Found"); } return console.log("Pattern Not Found"); } const sentence = "We write JavaScript code for people!"; testStrForPattern(sentence, /javascript|code|web/i); // Output: "Pattern Found" testStrForPattern(sentence, /php|web/i); // Output: "Pattern Not Found"
Выберите подходящий инструмент для работы
«Выберите подходящий инструмент для работы» - это предложение, которое мы часто слышим в промышленности, и я подозреваю, что многие из нас действительно стараются его соблюдать. Я слышу, что это предложение наиболее часто используется при обращении к макрорешениям проблемы, например, при использовании соответствующего программного пакета или при выборе подходящей методологии разработки программного обеспечения. Теперь я даю ту же рекомендацию, чтобы выбрать правильный инструмент для работы на микроуровне (в коде), потому что это тоже имеет значение.
String.prototype.match ()
str.match(pattern)
Если строка соответствует выражению, она вернет
Array
, содержащий всю совпавшую строку в качестве первого элемента, за которым следуют любые результаты, записанные в круглых скобках. Если совпадений не было, возвращаетсяnull
.
RegExp.prototype.test ()
pattern.test(str)
Возвращает
true
, если есть совпадение между регулярным выражением и указанной строкой; в противном случаеfalse
.
Первое решение работает, потому что, если шаблон найден, возвращаемый массив будет оцениваться как true
в операторе if
и false
, когда возвращается null
из-за отсутствия шаблона в строке.
Однако match
не был разработан для простой и эффективной проверки наличия в строке шаблона. Предвидя неправомерное использование match
, документов Сети разработчиков Mozilla,
Если вам нужно узнать, соответствует ли строка регулярному выражению
RegExp
, используйтеRegExp.test()
Наконец, мы можем догадаться, что match
работает медленнее, чем test
. Только представьте, что делается дополнительная работа по созданию массива всех совпавших подстрок, а не по возврату единственного значения при первом совпадении. Все еще не верите? Посмотрите, насколько test
быстрее, чем match
здесь. Это намного быстрее!
Заключительные слова
Используйте test
, чтобы выполнить простую логическую проверку, существует ли шаблон в строке, и match
, чтобы создать массив совпадений, найденных в строке. Когда дело доходит до решения проблем с кодом, выбор правильного инструмента для работы так же важен как для микро, так и для макроса.