如何简化针对多个正则表达式的字符串测试

How to simplify testing a string against multiple regexes

本文关键字:正则表达式 字符串 测试 何简化      更新时间:2024-03-30

我想验证字符串是spotify、youtube还是无效URL。这是可行的,但似乎可以做得更简单。如何提高效率?

String.prototype.spotifyUrl = function() {
  return this.match(/^(spotify:|https:'/'/[a-z]+'.spotify'.com'/)/);
}
String.prototype.youtubeUrl = function() {
  return this.match(/^(?:https?:'/'/)?(?:www'.)?(?:youtu'.be'/|youtube'.com'/(?:embed'/|v'/|watch'?v=|watch'?.+&v=))(('w|-){11})(?:'S+)?$/);
}
function validateUrl (url) {
  if ( url.spotifyUrl() ) {
    alert('spotify');
  } 
  else if ( url.youtubeUrl() ) {
    alert('youtube');
  }
  else {
    alert('invalid url');
  }
};
validateUrl('https://open.spotify.com/track/3JiockjOTd8m2VGcTGkmew');

JS Fiddle

您可以为每个站点创建一个属性为的对象

var sites = {
    spotify: /^(spotify:|https:'/'/[a-z]+'.spotify'.com'/)/,
    youtube: /^(?:https?:'/'/)?(?:www'.)?(?:youtu'.be'/|youtube'.com'/(?:embed'/|v'/|watch'?v=|watch'?.+&v=))(('w|-){11})(?:'S+)?$/,
};
function validateUrl (url) {
    for (var site in sites) { 
        if ( url.match(sites[site]) ) return site;
    }
};
// I/O:
var div = document.querySelector('div');
var input = document.querySelector('input');
input.oninput = reportValidation;
function reportValidation() {
    div.textContent = validateUrl(input.value) || 'invalid url';
}
reportValidation();
Type URL:<br>
<input type="text" size="60" value="https://open.spotify.com/track/3JiockjOTd8m2VGcTGkmew">
<div></div>

如果您不需要依赖Spotify和YouTube的单独返回,那么您可以将正则表达式与|结合起来,而不用考虑String原型函数:

function validateUrl(url) {
  if (url.match(/^(spotify:|https:'/'/[a-z]+'.spotify'.com'/)|^(?:https?:'/'/)?(?:www'.)?(?:youtu'.be'/|youtube'.com'/(?:embed'/|v'/|watch'?v=|watch'?.+&v=))(('w|-){11})(?:'S+)?$/)) {
    alert('valid');
  } else {
    alert('invalid url');
  }
};
validateUrl('https://open.spotify.com/track/3JiockjOTd8m2VGcTGkmew');

如果目的是只检查URL的来源,那么更短的时间是只检查spotify.comyoutu.beyoutube.com

function validateUrl(url) {
  if (url.match(/spotify'.com/)) {
    alert('spotify');
  } else if (url.match(/youtu'.be|youtube'.com/)) {
    alert('youtube');
  } else {
    alert('invalid url');
  }
};
validateUrl('https://open.spotify.com/track/3JiockjOTd8m2VGcTGkmew');