Как найти подстроку в массиве строк

ref:
In javascript, how do you search an array for a substring match

The solution given here is generic unlike the solution 4556343#4556343, which requires a previous parse to identify a string with which to join(), that is not a component of any of the array strings.
Also, in that code /!id-[^!]*/ is more correctly, /![^!]*id-[^!]*/ to suit the question parameters:

  1. «search an array …» (of strings or numbers and not functions, arrays, objects, etc.)
  2. «for only part of the string to match » (match can be anywhere)
  3. «return the … matched … element» (singular, not ALL, as in «… the … elementS»)
  4. «with the full string» (include the quotes)

… NetScape / FireFox solutions (see below for a JSON solution):

javascript:         /* "one-liner" statement solution */
   alert(
      ["x'!x'"id-2",'' "id-1 "',   "item","thing","id-3-text","class" ] .
         toSource() . match( new RegExp( 
            '[^\\]("([^"]|\\")*' + 'id-' + '([^"]|\\")*[^\\]")' ) ) [1]
   );

or

javascript:
   ID = 'id-' ;
   QS = '([^"]|\\")*' ;           /* only strings with escaped double quotes */
   RE = '[^\\]("' +QS+ ID +QS+ '[^\\]")' ;/* escaper of escaper of escaper */
   RE = new RegExp( RE ) ;
   RA = ["x'!x'"id-2",'' "id-1 "',   "item","thing","id-3-text","class" ] ;
   alert(RA.toSource().match(RE)[1]) ;

displays "x'!x'"id-2".
Perhaps raiding the array to find ALL matches is ‘cleaner’.

/* literally (? backslash star escape quotes it!) not true, it has this one v  */
javascript:                            /* purely functional - it has no ... =! */
   RA = ["x'!x'"id-2",'' "id-1 "',   "item","thing","id-3-text","class" ] ;
   function findInRA(ra,id){
      ra.unshift(void 0) ;                                     /* cheat the [" */
      return ra . toSource() . match( new RegExp(
             '[^\\]"' + '([^"]|\\")*' + id + '([^"]|\\")*' + '[^\\]"' ,
             'g' ) ) ;
   }
   alert( findInRA( RA, 'id-' ) . join('nn') ) ;

displays:

     "x'!x'"id-2"

     "' "id-1 ""

     "id-3-text"

Using, JSON.stringify():

javascript:                             /* needs prefix cleaning */
   RA = ["x'!x'"id-2",'' "id-1 "',   "item","thing","id-3-text","class" ] ;
   function findInRA(ra,id){
      return JSON.stringify( ra ) . match( new RegExp(
             '[^\\]"([^"]|\\")*' + id + '([^"]|\\")*[^\\]"' ,
             'g' ) ) ;
   }
   alert( findInRA( RA, 'id-' ) . join('nn') ) ;

displays:

    ["x'!x'"id-2"

    ,"' "id-1 ""

    ,"id-3-text"

wrinkles:

  • The «unescaped» global RegExp is /[^]"([^"]|")*id-([^"]|")*[^]"/g with the to be found literally. In order for ([^"]|")* to match strings with all "‘s escaped as ", the itself must be escaped as ([^"]|\")*. When this is referenced as a string to be concatenated with id-, each must again be escaped, hence ([^"]|\\")*!
  • A search ID that has a , *, ", …, must also be escaped via .toSource() or JSON or … .
  • null search results should return '' (or "" as in an EMPTY string which contains NO "!) or [] (for all search).
  • If the search results are to be incorporated into the program code for further processing, then eval() is necessary, like eval('['+findInRA(RA,ID).join(',')+']').

———————————————————————————

Digression:
Raids and escapes? Is this code conflicted?
The semiotics, syntax and semantics of /* it has no ... =! */ emphatically elucidates the escaping of quoted literals conflict.

Does «no =» mean:

  • «no ‘=’ sign» as in javascript:alert('x3D') (Not! Run it and see that there is!),
  • «no javascript statement with the assignment operator»,
  • «no equal» as in «nothing identical in any other code» (previous code solutions demonstrate there are functional equivalents),

Quoting on another level can also be done with the immediate mode javascript protocol URI’s below. (// commentaries end on a new line (aka nl, ctrl-J, LineFeed, ASCII decimal 10, octal 12, hex A) which requires quoting since inserting a nl, by pressing the Return key, invokes the URI.)

javascript:/* a comment */  alert('visible')                                ;
javascript:// a comment ;   alert(  'not'  ) this is all comment             %0A;
javascript:// a comment %0A alert('visible but  %A  is wrong ')   // X     %0A
javascript:// a comment %0A alert('visible but %'+'0A is a pain to type')   ;

Note: Cut and paste any of the javascript: lines as an immediate mode URI (at least, at most?, in FireFox) to use first javascript: as a URI scheme or protocol and the rest as JS labels.

After searching for an answer in other posts, I felt I have to ask this.
I looked at How do I check if an array includes an object in JavaScript?
and Best way to find if an item is in a JavaScript array? and couldn’t get the code there to work.

I am capturing an html embed code into an array, so each item is a line of html code.

for example:

i[0]='<param name="bgcolor" value="#FFFFFF" />'
i[1]='<param name="width" value="640" />'
i[2]='<param name="height" value="360" />'   
i[3]='more html code' 

I want to search this array and find the line where the word ‘height’ is.

So ideally, I’d like to write a function that returns the index of the item where ‘height’ appears.

Fortunately, there are no duplicates in this array, so there’s only one occurrence.

with simple object search I get ‘false’ returns.

Any idea?

Community's user avatar

asked Mar 24, 2011 at 19:32

someuser's user avatar

It’s as simple as iterating the array and looking for the regexp

function searchStringInArray (str, strArray) {
    for (var j=0; j<strArray.length; j++) {
        if (strArray[j].match(str)) return j;
    }
    return -1;
}

Edit — make str as an argument to function.

Saurabh Kumar's user avatar

answered Mar 24, 2011 at 19:39

Aleadam's user avatar

AleadamAleadam

40.1k9 gold badges86 silver badges108 bronze badges

7

You can use Array.prototype.find function in javascript.
Array find MDN.

So to find string in array of string, the code becomes very simple. Plus as browser implementation, it will provide good performance.

Ex.

var strs = ['abc', 'def', 'ghi', 'jkl', 'mno'];
var value = 'abc';
strs.find(
    function(str) {
        return str == value;
    }
);

or using lambda expression it will become much shorter

var strs = ['abc', 'def', 'ghi', 'jkl', 'mno'];
var value = 'abc';
strs.find((str) => str === value);

answered Jul 12, 2016 at 9:53

Chetan Khilosiya's user avatar

1

Extending the contains function you linked to:

containsRegex(a, regex){
  for(var i = 0; i < a.length; i++) {
    if(a[i].search(regex) > -1){
      return i;
    }
  }
  return -1;
}

Then you call the function with an array of strings and a regex, in your case to look for height:

containsRegex([ '<param name="bgcolor" value="#FFFFFF" />', 'sdafkdf' ], /height/)

You could additionally also return the index where height was found:

containsRegex(a, regex){
  for(var i = 0; i < a.length; i++) {
    int pos = a[i].search(regex);
    if(pos > -1){
      return [i, pos];
    }
  }
  return null;
}

answered Mar 24, 2011 at 19:36

Janick Bernet's user avatar

Janick BernetJanick Bernet

20.4k2 gold badges28 silver badges55 bronze badges

1

It’s faster to avoid using regular expressions, if you’re just trying to find the first substring match within an array of string values. You can add your own array searching function:

Code:

Array.prototype.findFirstSubstring = function(s) {
            for(var i = 0; i < this.length;i++)
            {
                if(this[i].indexOf(s) !== -1)
                    return i;
            }
            return -1;
        };

Usage:

i.findFirstSubstring('height');

Returns:

-1 if not found or the array index of the first substring occurrence if it is found (in your case would be 2)

Community's user avatar

answered Jun 21, 2016 at 17:55

Alex W's user avatar

Alex WAlex W

37k13 gold badges106 silver badges109 bronze badges

Simple and Great Code, Support Multi words

let strArray = ["Please locate where 'locate' occurs!","Hi Hashem it","do it","for free"];

strArray.filter(word=> word.includes("it"));
Output
//Hi Hashem it,do it

//-------------------

strArray.filter(word=> word.includes("do it"));
Output
//do it

answered Jul 24, 2022 at 2:19

Hashem Ahmed's user avatar

0

In-case if someone wants a little dynamic search.

 let searchInArray=(searchQuery, array, objectKey=null)=>{

  return array.filter(d=>{
      let data =objectKey? d[objectKey] : d //Incase If It's Array Of Objects.
       let dataWords= typeof data=="string" && data?.split(" ")?.map(b=>b&&b.toLowerCase().trim()).filter(b=>b)
      let searchWords = typeof searchQuery=="string"&&searchQuery?.split(" ").map(b=>b&&b.toLowerCase().trim()).filter(b=>b)

     let matchingWords = searchWords.filter(word=>dataWords.includes(word))

    return matchingWords.length

})
    
    
}

For an Array of strings:

let arrayOfStr = [
  "Search for words",
  "inside an array",
  "dynamic searching",
  "match rate 90%"
]

searchInArray("dynamic search", arrayOfStr)

//Results: [ "Search for words", "dynamic searching" ]

For an Array of Objects:

let arrayOfObject = [
  {
    "address": "Karachi Pakistan"
  },
  {
    "address": "UK London"
  },
  {
    "address": "Pakistan Lahore"
  }
]

searchInArray("Pakistan", arrayOfObject,"address")

//Results: [ { "address": "Karachi Pakistan" }, { "address": "Pakistan Lahore" } ]

answered Dec 4, 2020 at 0:53

Kashan Haider's user avatar

Kashan HaiderKashan Haider

9861 gold badge12 silver badges23 bronze badges

var newArr= [];
function searchStringInArray (str, strArray) {
       newArr = [];
    strArray.map(item => {
        str.includes(item) ? newArr.push(item) : '';
    });
  return newArr;
}

var result = searchStringInArray('Definitely",he said in a matter-of-fact tone.', ['matter', 'definitely']);

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

answered May 7, 2021 at 9:55

Ravi Ashara's user avatar

Ravi AsharaRavi Ashara

1,1777 silver badges14 bronze badges

To search inside an array you can simply use an Iteration method ( forEach/ map ) and, inside that use JavaScript String search method

Reference https://www.w3schools.com/jsref/jsref_search.asp

Example

const arrayOfLists = ['ape', 'apple', 'auto'];
const searchString = "A"

let matchingStrings = [];

arrayOfLists.forEach((list) => {
    if (list.toLocaleLowerCase().search(searchString.toLocaleLowerCase()) > -1) {
        matchingStrings.push(list)
    }
})

matchingStrings array will have list of all likely occurrences

answered May 7, 2021 at 10:41

Mohamed Ismail's user avatar

This is a guide on how to use PHP to search for a particular substring in an array. In this tutorial, we will create a custom function that loops through an array and checks each element for a given substring.

Let’s take a look at the following PHP snippet:

<?php

//We create an array called $animals.
$animals = array(
    'Dog',
    'Cat',
    'Zebra',
    'Lion',
    'Elephant'
);

//Our custom function.
function stristrarray($array, $str){
    //This array will hold the indexes of every
    //element that contains our substring.
    $indexes = array();
    foreach($array as $k => $v){
        //If stristr, add the index to our
        //$indexes array.
        if(stristr($v, $str)){
            $indexes[] = $k;
        }
    }
    return $indexes;
}

//Searching for the substring "cat" will return one result.
$result = stristrarray($animals, 'cat');
//The result is an array containing "1"
var_dump($result);

Inside our function:

  1. We create an empty array called $indexes. This will be filled with the indexes of any elements that contain our given substring.
  2. We loop through every element in the array.
  3. Inside our loop, we check to see if the given substring is present.
  4. If it is present, we add the index of that element to our $indexes array.
  5. Finally, we return the $indexes array.

If the substring is not found, our custom function will return an empty array. If the string is found in multiple elements, then the returned array will contain multiple elements.

Время на прочтение
2 мин

Количество просмотров 56K

Недавно решал задачу, когда нужно было определить, попадает ли определённое (строковое) значение во множество допустимых значений.
В JavaScript 1.6 существует метод indexOf объекта Array для поиска в массиве, но этот метод не поддерживается в Internet Explorer. Для IE данный метод реализовывается с помощью перебора массива в цикле.
Но так как порядок следования элементов был не важен и каждая миллисекунда была на счету, то я сравнил производительность перебора цикла в массиве с другими вариантами поиска (без перебора).

А варианты поиска без перебора следующие:

  1. Склейка массива в строку и поиск в строке

    if (myarray.join().search("Строка поиска") != -1) { ... }* This source code was highlighted with Source Code Highlighter.

    При использовании этого способа нужно учесть проблему уникальности вхождения подстроки поиска в склеенную из массива строку. Для этого можно, например, использовать символы склейки, которые априорно не встречаются в строке:

    if (("#" + myarray.join("#,#") + "#").search("#Строка поиска#") != -1) { ... }* This source code was highlighted with Source Code Highlighter.

  2. Использование объекта вместо массива, «значениями массива» являются ключи хеша

    if ("Строка поиска" in myarray) { ... }* This source code was highlighted with Source Code Highlighter.

Для оценки производительности каждого из трёх методов поиска я создал тестовую страницу, на которой создаётся 100 000 строк вида «СтрокаN», где N — номер строки, и затем производится поиск строки «Строка60000».
Оказалось, что оператор in работает практически мгновенно (время выполнения всегда 0), даже в IE6!

Результаты тестов (Celeron 2.4)

Браузер in String.search Array.indexOf
IE6 ноль 94 2859
IE7 ноль 125 390
FF2 ноль 2016 31
FF3 ноль 71 3
O9 ноль 281 47
Safari3 ноль 188 31

Время поиска в мс.

Алгоритмы на строках

A. Сравнения подстрок

ограничение по времени на тест: 2 секунды

ограничение по памяти на тест: 256 мегабайт

ввод: стандартный ввод

вывод: стандартный вывод

Дана строка. Нужно уметь отвечать на запросы вида: равны ли подстроки [a..b] и [c..d].

Входные данные

Сперва строка S (не более 10^5 строчных латинских букв). Далее число M — количество запросов.

В следующих M строках запросы a,b,c,d. 0 ≤ M ≤ 10^5, 1 ≤ a ≤ b ≤ |S|, 1 ≤ c ≤ d ≤ |S|

Выходные данные

M строк. Выведите Yes, если подстроки совпадают, и No иначе.

Примеры

входные данные

trololo
3
1 7 1 7
3 5 5 7
1 1 1 5

выходные данные

Решение

ограничение по времени на тест: 2 секунды

ограничение по памяти на тест: 256 мегабайт

ввод: стандартный ввод

вывод: стандартный вывод

Постройте префикс-функцию для заданной строки s.

Входные данные

Первая строка входного файла содержит s (1 ≤ |s| ≤ 10^6). Строка состоит из букв латинского алфавита.

Выходные данные

Выведите значения префикс-функции строки s для всех индексов 1, 2, …, |s|.

Примеры

входные данные

выходные данные

Решение

C. Z-функция

ограничение по времени на тест: 2 секунды

ограничение по памяти на тест: 256 мегабайт

ввод: стандартный ввод

вывод: стандартный вывод

Постройте Z-функцию для заданной строки s.

Входные данные

Первая строка входного файла содержит s (1 ≤ |s| ≤ 10^6). Строка состоит из букв латинского алфавита.

Выходные данные

Выведите значения Z-функции строки s для индексов 2, 3, …, |s|.

Примеры

входные данные

выходные данные

входные данные

выходные данные

Решение

D. Быстрый поиск подстроки в строке

ограничение по времени на тест: 2 секунды

ограничение по памяти на тест: 256 мегабайт

ввод: стандартный ввод

вывод: стандартный вывод

Даны строки p и t. Требуется найти все вхождения строки p в строку t в качестве подстроки.

Входные данные

Первая строка входного файла содержит p, вторая — t (1 ≤ |p|, |t| ≤ 10^6). Строки состоят из букв латинского алфавита.

Выходные данные

В первой строке выведите количество вхождений строки p в строку t. Во второй строке выведите в возрастающем порядке номера символов строки t, с которых начинаются вхождения p. Символы нумеруются с единицы.

Примеры

входные данные

выходные данные

Решение

E. Поиск периода

ограничение по времени на тест: 2 секунды

ограничение по памяти на тест: 256 мегабайт

ввод: стандартный ввод

вывод: стандартный вывод

Дана строка s. Требуется найти минимальную по длине строку t, такую что s представима в виде конкатенации одной или нескольких строк t.

Входные данные

Первая строка входного файла содержит s (1 ≤ |s| ≤ 10^6). Строка состоит из букв латинского алфавита.

Выходные данные

Выведите длину искомой строки t.

Примеры

входные данные

выходные данные

входные данные

выходные данные

Решение

F. Подстроки-3

ограничение по времени на тест: 2 секунды

ограничение по памяти на тест: 256 мегабайт

ввод: стандартный ввод

вывод: стандартный вывод

Даны K строк из маленьких латинских букв. Требуется найти их наибольшую общую подстроку.

Входные данные

В первой строке число K (1 ≤ K ≤ 10).

В следующих K строках — собственно K строк (длины строк от 1 до 10 000).

Выходные данные

Наибольшая общая подстрока.

Примеры

входные данные

3
abacaba
mycabarchive
acabistrue

выходные данные

G. Множественный поиск

ограничение по времени на тест: 2 секунды

ограничение по памяти на тест: 256 мегабайт

ввод: search4.in

вывод: search4.out

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

Входные данные

Первая строка входного файла содержит целое число n — число элементов в s (1 ≤ n ≤ 10^6). Следующие n строк содержат по одной строке si. Сумма длин всех строк из s не превосходит 10^6. Последняя строка входного файла содержит t (1 ≤ t ≤ 10^6). Все строки состоят из строчных латинских букв.

Выходные данные

Для каждой строки si выведите «YES», если она встречается в t и «NO» в противном случае. Строки нумеруются в порядке появления во входном файле.

Примеры

входные данные

3
abc
abcdr
abcde
xabcdef

выходные данные

Решение

H. Множественный поиск 2

ограничение по времени на тест: 2 секунды

ограничение по памяти на тест: 256 мегабайт

ввод: search5.in

вывод: search5.out

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

Входные данные

Первая строка входного файла содержит целое число n — число элементов в s (1 ≤ n ≤ 10^6). Следующие n строк содержат по одной строке si. Сумма длин всех строк из s не превосходит 10^6. Последняя строка входного файла содержит t (1 ≤ t ≤ 10^6). Все строки состоят из строчных латинских букв

Выходные данные

Для каждой строки si выведите одно число: сколько раз она встречается в t. Строки нумеруются в порядке появления во входном файле.

Примеры

входные данные

3
abc
abcdr
abcde
xabcdef

выходные данные

I. Множественный поиск 3

ограничение по времени на тест: 2 секунды

ограничение по памяти на тест: 512 мегабайт

ввод: search6.in

вывод: search6.out

Дан массив строк si и строка t. Требуется для каждой строки si найти самое левое и самое правое вхождение в t как подстроки.

Входные данные

Первая строка входного файла содержит целое число n — число элементов в s (1 ≤ n ≤ 10^6). Следующие n строк содержат по одной строке si. Сумма длин всех строк из s не превосходит 10^6. Последняя строка входного файла содержит t (1 ≤ t ≤ 10^6). Все строки состоят из строчных латинских букв.

Выходные данные

Для каждой строки si выведите два числа: индексы самой левой и самой правой позиции, в которых она встречается в t. Если строка не встречается в t ни разу, выведите  - 1  - 1. Строки нумеруются в порядке появления во входном файле. Позиции нумеруются с 0.

Примеры

входные данные

выходные данные

J. Суффиксный массив

ограничение по времени на тест: 2 секунды

ограничение по памяти на тест: 512 мегабайт

ввод: стандартный ввод

вывод: стандартный вывод

Постройте суффиксный массив для заданной строки s, для каждых двух соседних суффиксов найдите длину максимального общего префикса.

Входные данные

Первая строка входного файла содержит строку s (1 ≤ |s| ≤ 400 000). Строка состоит из строчных латинских букв.

Выходные данные

В первой строке выведите |s| различных чисел — номера первых символов суффиксов строки s так, чтобы соответствующие суффиксы были упорядочены в лексикографически возрастающем порядке. Во второй строке выведите |s| - 1 чисел — длины наибольших общих префиксов.

Примеры

входные данные

выходные данные

Решение

K. Количество подстрок

ограничение по времени на тест: 2 секунды

ограничение по памяти на тест: 512 мегабайт

ввод: стандартный ввод

вывод: стандартный вывод

Вычислите количество различных подстрок строки s.

Входные данные

Единственная строка входного файла содержит строку s (1 ≤ |s| ≤ 400 000). Строка состоит из строчных латинских букв.

Выходные данные

Выведите одно число — ответ на задачу.

Примеры

входные данные

выходные данные

Решение

L. Циклические сдвиги

ограничение по времени на тест: 2 секунды

ограничение по памяти на тест: 512 мегабайт

ввод: стандартный ввод

вывод: стандартный вывод

k-м циклическим сдвигом строки S называется строка, полученная перестановкой k первых символов строки S в конец строки.

Рассмотрим все различные циклические сдвиги строки S и отсортируем их по возрастанию. Требуется вычислить i-ю строчку этого массива.

Например, для строки abacabac существует четыре различных циклических сдвига: нулевой (abacabac), первый (bacabaca), второй (acabacab) и третий (cabacaba). После сортировки по возрастанию получится такой массив: abacabac, acabacab, bacabaca, cabacaba.

Входные данные

В первой строке входного файла записана строка S, длиной не более 100 000 символов с ASCII-кодами от 32 до 126. Во второй строке содержится единственное целое число k (1 ≤ k ≤ 100 000).

Выходные данные

В выходной файл выведите k-й по возрастанию циклический сдвиг строки S, или слово IMPOSSIBLE, если такого сдвига не существует.

Примеры

входные данные

выходные данные

входные данные

выходные данные

Решение

M. Наибольшая общая подстрока

ограничение по времени на тест: 2 секунды

ограничение по памяти на тест: 512 мегабайт

ввод: common.in

вывод: common.out

Найдите наибольшую общую подстроку строк s и t.

Входные данные

Первая строка входного файла содержит строку s, вторая — t (1 ≤ |s|, |t| ≤ 100,000). Строки состоят из строчных латинских букв.

Выходные данные

Выведите одну строку — наибольшую общую подстроку строк s и t. В случае, если ответ не единственный, выведите минимальный лексикографически.

Примеры

входные данные

выходные данные

входные данные

выходные данные

Решение

Понравилась статья? Поделить с друзьями:
  • Как составить рацион в экселе
  • Как найти перепись населения 1897 по фамильная
  • Как найти отглагольные существительные в тексте
  • Как найти угловой коэффициент касательной производная
  • Как можно исправить кредитную историю совкомбанк