Проверьте, не является ли результат .match() пустым

#javascript #jquery

#javascript #jquery

Вопрос:

Я запускаю это регулярное выражение .match() :

 var pattern = /property="og:description"scontent="(. ?)"/;   
var matches = data.match(pattern);
    
if (matches[1]) {
   var = description = matches[1];
}
 

Но иногда я получаю эту ошибку:

 Uncaught TypeError: matches is null
 

Что я могу сделать, чтобы проверить, matches[1] не пусто ли?

Что я пробовал до сих пор

Я попробовал это:

 if (matches amp;amp; matches[1]) {
 

И

 if (matches.length amp;amp; matches[1].length) {
 

И

 if (matches[1] != null) {
 

И

 if (matches[1] != undefined amp;amp; matches[1] != null) {
 

Все еще иногда получаю эту ошибку. Очевидно, я что-то упускаю.

Комментарии:

1. Я думаю, что есть синтаксическая ошибка, если это из полного примера. Вы назначаете var, который является зарезервированным словом. Может ли это быть причиной? В противном случае нет проблем с тем, как вы проверяете это в примере первой попытки, который вы привели.

Ответ №1:

Удалите [1] from matches , когда убедитесь, что у него есть значение. Ошибка заключается в том, что вы пытаетесь получить доступ к нулевому значению по индексу.

 let pattern = /property="og:description"scontent="(. ?)"/;   

['foobar', 'property="og:description" content="abc"'].forEach(data => {
   let matches = data.match(pattern);
   let description = 'no match';
   if (matches) 
    description = matches[1];
    
   console.log(description);   
}); 

Комментарии:

1. Но теоретически это тоже не matches amp;amp; matches[1] сработало бы?

2. На самом деле это неверно, если вы получаете доступ к совпадениям amp;amp; matches[1], вы все равно можете выполнить то же условие. Если вы попробуете, этот код будет успешным.

3. Вы правы — моя ошибка. Первое совпадение, если таковое имеется, является полной совпадающей строкой. Так что да, matches amp;amp; match[1] это тоже сработает. Я обновил ответ, чтобы предоставить логику соответствия / отсутствия соответствия