2014-10-07 6 views
23

скажем, у меня есть массив с большим количеством строк Called «birdBlue», «birdRed» и некоторыми другими животными, такими как «pig1», «pig2).Wildcard сравнения строк в JavaScript,

Теперь я запустить цикл, который идет через массив и должен вернуть все птицы. Да и какое сравнение имело бы смысл здесь?

Animals == "bird*" была моя первая идея, но не работает. есть ли способ использовать оператор * (или есть что-то подобное, чтобы использовать?

+3

(HTTPS : //developer.mozilla.org/en -US/docs/Web/JavaScript/Guide/Regular_Expressions) – Pointy

+0

Время, чтобы узнать о регулярных выражениях: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions, http: // www .regular-expressions.info/tutorial.html –

ответ

0
if(mas[i].indexOf("bird") == 0) 
    //there is bird 

Вы можете прочитать о indexOf здесь: http://www.w3schools.com/jsref/jsref_indexof.asp

+1

Поскольку OP является новичком, я уверен, что они ценят ** объяснение **. –

+2

Обратите внимание, что это имеет значительные накладные расходы на длинные строки, которые не начинаются с 'bird'. Использование ['startWith' может быть лучшим решением] (http://stackoverflow.com/q/646628/1048572) – Bergi

7

Вы должны использовать RegExp (они являются удивительными) простым решением является:

if(/^bird/.test(animals[i])){ 
    // a bird :D 
} 
+2

Лучшим выбором семантически может быть' /^bird/.test (...) '. – RobG

+0

Вы совершенно правы! обновление! – Davsket

0

Вы можете использовать метод substring в JavaScript. Например:

var list = ["bird1", "bird2", "pig1"] 

for (var i = 0; i < list.length; i++) { 
    if (list[i].substring(0,4) == "bird") { 
    console.log(list[i]); 
    } 
} 

который выводит:

bird1 
bird2 

В принципе, вы проверяете каждый элемент массива, чтобы увидеть, если первые четыре буквы «птица». Это предполагает, что «птица» всегда будет в передней части строки.


Так скажем, ваш получить путь к файлу из URL:

Допустим, что ваш на bird1 = letsfly - вы можете использовать этот код для проверки URL:

var listOfUrls = [ 
        "bird1?=letsfly", 
        "bird", 
        "pigs?=dontfly", 
       ] 

for (var i = 0; i < list.length; i++) { 
    if (listOfUrls[i].substring(0,4) === 'bird') { 
    // do something 
    } 
} 

выше будет соответствовать первому URL-адресу, но не третья (а не свинья). Вы можете легко поменять url.substring(0,4) с регулярным выражением, или даже другой метод Javascript как .Contains()


Использование метода .contains() может быть немного более безопасным. Вам не нужно будет знать, в какой части URL-адреса находится «птица». Например:

var url = 'www.example.com/bird?=fly' 

if (url.contains('bird')) { 
    // this is true 
    // do something 
} 
+0

Спасибо за ваш ответ. В моем реальном мире end-scenarion строки будут по гиперссылкам, хотя и только конец будет отличаться. И я буду использовать document.URL, чтобы сравнить их, поэтому я не могу использовать RegEx, не так ли? Чтобы он соответствовал примеру: http: // bird1 должен быть найден/возвращен, а http: // bird1? Param = letfly тоже Любые предложения? Какой самый умный способ? – xqz313

+0

Вы определенно можете использовать регулярное выражение, но вам это не нужно. На самом деле вы могли бы использовать пару вещей. Я просто немного обновил свой ответ, это ближе к тому, что вы ищете? Список URLS может поступать из любого места, включая 'document.url'. –

+0

Я думаю, что 'url.substring (0,4)' вернет 'http' для всех 3. То есть, если существует переменная' url' ('var url = list [i]') –

0
var searchArray = function(arr, str){ 
    // If there are no items in the array, return an empty array 
    if(typeof arr === 'undefined' || arr.length === 0) return []; 
    // If the string is empty return all items in the array 
    if(typeof str === 'undefined' || str.length === 0) return arr; 

    // Create a new array to hold the results. 
    var res = []; 

    // Check where the start (*) is in the string 
    var starIndex = str.indexOf('*'); 

    // If the star is the first character... 
    if(starIndex === 0) { 

     // Get the string without the star. 
     str = str.substr(1); 
     for(var i = 0; i < arr.length; i++) { 

      // Check if each item contains an indexOf function, if it doesn't it's not a (standard) string. 
      // It doesn't necessarily mean it IS a string either. 
      if(!arr[i].indexOf) continue; 

      // Check if the string is at the end of each item. 
      if(arr[i].indexOf(str) === arr[i].length - str.length) {      
       // If it is, add the item to the results. 
       res.push(arr[i]); 
      } 
     } 
    } 
    // Otherwise, if the star is the last character 
    else if(starIndex === str.length - 1) { 
     // Get the string without the star. 
     str = str.substr(0, str.length - 1); 
     for(var i = 0; i < arr.length; i++){ 
      // Check indexOf function     
      if(!arr[i].indexOf) continue; 
      // Check if the string is at the beginning of each item 
      if(arr[i].indexOf(str) === 0) { 
       // If it is, add the item to the results. 
       res.push(arr[i]); 
      } 
     } 
    } 
    // In any other case... 
    else {    
     for(var i = 0; i < arr.length; i++){ 
      // Check indexOf function 
      if(!arr[i].indexOf) continue; 
      // Check if the string is anywhere in each item 
      if(arr[i].indexOf(str) !== -1) { 
       // If it is, add the item to the results 
       res.push(arr[i]); 
      } 
     } 
    } 

    // Return the results as a new array. 
    return res; 
} 

var birds = ['bird1','somebird','bird5','bird-big','abird-song']; 

var res = searchArray(birds, 'bird*'); 
// Results: bird1, bird5, bird-big 
var res = searchArray(birds, '*bird'); 
// Results: somebird 
var res = searchArray(birds, 'bird'); 
// Results: bird1, somebird, bird5, bird-big, abird-song 

Существует длинный список предостережений к способу, как это, и длинный список «что если», которые не принимаются во внимание, некоторые из которых упомянуты в других ответах , Но для простого использования синтаксиса звезды это может быть хорошей отправной точкой.

Fiddle

+0

Спасибо за замечательный ответ. Разве это не встроено в JS и может быть использовано «из коробки»? :/ – xqz313

+0

Нет, на самом деле, встроенный javascript - это использование регулярного выражения для сопоставления шаблонов. @Davsket ответ показывает, как вы можете это сделать, а комментарии по вашему вопросу содержат более подробную информацию о том, как использовать Regex. Лично, для чего-то подобного я бы использовал подход регулярного выражения, но для конкретного обращения к вашему «птичьему» формату этого ответа будет достаточно для простого использования. –

+0

Проблема с Regex заключается в том, что в сценарии реального мира содержимое массива будет гиперссылками, и я сравню их с (document.URL). Скажем, строка/url в массиве: http://bird1.com Если documentUrl - http://bird1.com, мне нужно вернуть это, но если это http://bird1.com? param = letfly, который также должен быть возвращен. Как я могу решить этот самый эффективный способ? :/ – xqz313

47

Я думаю, что вы имели в виду что-то вроде «*» (звездочка) в качестве шаблона, например:

  • «а * Ь» => все, что начинается с «а» и заканчивается "б"
  • "а *" => все, что начинается с "а"
  • "* б" => все, что заканчивается на "б"
  • "* а *" => все, что имеет " a "в нем
  • «* а * Ь *» => все, что есть «а» в нем, после чего-либо, а затем «Ъ», а затем что-нибудь

или в вашем примере: «птица *» => все, что начинается с птицей

у меня была аналогичная проблема, и написал функцию с RegExp:

//Short code 
 
function matchRuleShort(str, rule) { 
 
    return new RegExp("^" + rule.split("*").join(".*") + "$").test(str); 
 
} 
 

 
//Explanation code 
 
function matchRuleExpl(str, rule) { 
 
    // "." => Find a single character, except newline or line terminator 
 
    // ".*" => Matches any string that contains zero or more characters 
 
    rule = rule.split("*").join(".*"); 
 

 
    // "^" => Matches any string with the following at the beginning of it 
 
    // "$" => Matches any string with that in front at the end of it 
 
    rule = "^" + rule + "$" 
 

 
    //Create a regular expression object for matching string 
 
    var regex = new RegExp(rule); 
 

 
    //Returns true if it finds a match, otherwise it returns false 
 
    return regex.test(str); 
 
} 
 

 
//Examples 
 
alert(
 
    "1. " + matchRuleShort("bird123", "bird*") + "\n" + 
 
    "2. " + matchRuleShort("123bird", "*bird") + "\n" + 
 
    "3. " + matchRuleShort("123bird123", "*bird*") + "\n" + 
 
    "4. " + matchRuleShort("bird123bird", "bird*bird") + "\n" + 
 
    "5. " + matchRuleShort("123bird123bird123", "*bird*bird*") + "\n" 
 
);


Если вы хотите узнать больше о используемых функций: [. JavaScript поддерживает регулярные выражения]

+0

Theres потенциальная проблема с этим ответом. Строка .replace() Javascript со строкой первого аргумента заменяет только первый найденный символ, поэтому 4-й пример \ * a \ * не будет работать. Вы можете использовать .replace (/ \\ */g, '.* '), чтобы заменить все * s – ThadeuLuz

+0

@ThadeuLuz: Это неверно. JavaScript .replace() принимает регулярное выражение и заменяет все найденные символы, которые соответствуют регулярному выражению => http://www.w3schools.com/jsref/jsref_replace.asp – Spen

+1

Не со строкой по первому аргументу, как в строке Посмотрите сами: <"world world" .replace ("world", "hello")> – ThadeuLuz

Смежные вопросы