正则表达式:如何确定字符串是否包含给定子字符串的整个集合?

时间:2017-04-24 22:16:35

标签: javascript regex

说我有一系列子串“[' abcd',' xyz',' 091823',' 9 - +#$ _# $ *'。如何使用正则表达式来确保给定的字符串包含所有这些?

3 个答案:

答案 0 :(得分:0)

尝试使用lookarounds:

/(?=.*abcd)(?=.*xyz)(?=.*091823)(?=.*9-\+#\$_#\$\*)/

对于要测试的任何字符串数组的一般情况:

function containsAll(str, arrayOfStr) {
  return new RegExp(arrayOfStr.map(function (s) {
    return '(?=.*' + s.replace(/([-\\[\]{}.^$+*()|?])/g, '\\$1') + ')';
  }).join('')).test(str);
}

containsAll(str, ['abcd', 'xyz', '091823', '9-+#$_#$*']);

答案 1 :(得分:0)

听起来您想要采用动态搜索术语数组并检查另一个字符串是否包含所有搜索术语。我认为你不会找到一个只有正则表达式的解决方案;你应该遍历这些术语并单独检查每一个。此外,如果术语是动态的,您可能不想使用正则表达式,除非您知道它们不需要清理(例如,'9 - +#$ _#$ *'包含特殊的正则表达式字符)。

以下是一个示例解决方案:

var terms = ['abcd', 'xyz', '091823', '9-+#$_#$*'];
var tests = {
  success: 'abcd 091823 xyz 9-+#$_#$*',
  failure: 'abcd 091823 xyz'
}

var testKeys = Object.keys(tests);
for(var test of testKeys){
  var pass = true;
  for(var term of terms){
    if(tests[test].indexOf(term) == -1){
      pass = false;
      break;
    }
  }
  document.body.innerHTML += `${test}: ${pass}<br>`
}

答案 2 :(得分:0)

在谈论ES6时,您可以在不使用正则表达式的情况下使用includes()方法:

// When `str` doesn't contain all substrings
var str = 'there is no desired substring here';

result = ['abcd', 'xyz', '091823', '9-+#$_#$*'].every(function(e) {
   return str.includes(e);
});

console.log(result);