检查字符串是否存在于另一个字符串中(不完全相等)

时间:2018-07-17 12:37:14

标签: javascript

我有这2个字符串:

var test = 'BN123';
var behaviour = 'BN***,TA****';

我需要检查behaviour是否包含与test相同格式的字符串。

behaviour上,BNTA相等,而*表示它可以是任何字符。 (behaviour来自API,所以我不知道它有什么,这只是一个测试。)

在这种情况下,它应该返回true。现在,我只比较大小写behaviour作为单个字符串,但是我需要修改它:

isValidInput(behaviour, test) {
  if (behaviour.length != test.length) {
    return false;
  }
  for (var i = 0; i < behaviour.length; i++) {
    if (behaviour.charAt(i) == '*') {
      continue;
    }
    if (behaviour.charAt(i) != test.charAt(i)) {
      return false;
    }
  }
  return true;
}

6 个答案:

答案 0 :(得分:2)

我在您的实现中看到的唯一问题是,您不允许behaviour包含可能的用逗号分隔的字符串这一事实(至少对我来说是如此)。因此,您需要检查它们中的每一个:

// Check one behaviour string from the list
function isOneValidInput(behaviour, string) {
  if (behaviour.length != string.length) {
    return false;
  }

  for (var i = 0; i < behaviour.length; i++) {
    // Note we can easily combine those conditions, and use []
    // with strings
    if (behaviour[i] != '*' && behaviour[i] != string[i]) {
      return false;
    }
  }

  return true;
}

// Check all behaviour strings in a comma-separated one
function isValidInput(behaviours, string) {
  return behaviours.split(",").some(function(behaviour) {
    return isOneValidInput(behaviour, string);
  });
}

var string = 'BN123';
var behaviour = 'BN***,TA****';
console.log(isValidInput(behaviour, string));

(我坚持在那里的ES5是因为您似乎这样做了。)

答案 1 :(得分:2)

您可以使用Array.prototype的.some()

如下所示

function isValidInput(behaviour, string1) {
    if (behaviour.length != string1.length) {
      return false;
    }

    for (var i = 0; i < behaviour.length; i++) {
      if (behaviour.charAt(i) == '*') {
        continue;
      }

      if (behaviour.charAt(i) != string1.charAt(i)) {
        return false;
      }
    }

    return true;
  }
  
var test = 'BN123';
var behaviour = 'BN***,TA****';

console.log(behaviour.split(',').some(x => isValidInput(x,test)));
console.log(behaviour.split(',').some(x => isValidInput(x,"test")));

答案 2 :(得分:0)

这是您想要的吗?

var test = 'BN123';
var behaviour = 'BN***,TA****';

var behaviours = behaviour.split(',');
var result = behaviours.map(b => {
  if (b.length != test.length)
    return false;
  var pattern = b.split('*')[0];
  return pattern === test.substring(0,pattern.length);
}).find(r => r === true) > -1;


console.log(result)

答案 3 :(得分:0)

您可以使用新的.includes()方法查看字符串是否包含在另一个字符串中。请注意,这是区分大小写的。我提供了两种不可靠的行为来检查字符串。

var string = 'BN123';
var behaviour1 = 'BN123,TA1234';
var behaviour2 = 'BN120,TA1230';

function testStr(behaviour,string) {
 return behaviour.includes(string);
}


console.log(testStr(behaviour1,string)) // gives true
console.log(testStr(behaviour2,string)) // gives false

答案 4 :(得分:0)

isValidInput(behaviour, string) {  
    var array = behaviour.split(",");
    var flag = 0;
    for(var i = 0;i< array.length;i++){
        var now = array[i];
        var _flag = 1;
        if (now.length == string.length) {
            for (var j = 0; j < now.length; j++) {
                if (now.charAt(j) == '*') {
                    continue;
                }

                if (now.charAt(j) != string.charAt(j)) {
                   _flag = 0;
                } 
            }
            flag |= _flag;
        }
    } 
    return flag;
}

答案 5 :(得分:0)

尝试将您的行为修改为RegExp:

function checkFn(testStr) {

    var behaviour = '(BN...)|(TA....)'

    var r = new RegExp('^(' + behaviour + ')$')

    return r.test(testStr)
}

checkFn('BN123') // true
checkFn('BN12') // false
checkFn('BN1234') // false
checkFn('TA1234') // true
checkFn('TA123') // false
checkFn('TA12345') // false

或使用此fn:

function checkFn(testStr) {

    var behaviour = 'BN***,TA****'

    behaviour = behaviour
        .split(',')
        .reduce((r, el) => {
            r.push('(' + el.replace(/\*/g, '.') + ')')
            return r
        }, [])
        .join('|')

    var r = new RegExp('^('+behaviour+')$')

    return r.test(testStr)
}