{Методи за работа с низове. Свойства на низ.}

Низ

Низ в JavaScript е всяка поредица от нула или повече символи, заградени в единични или двойни кавички.

Примери:

‘string text’
„string text“
„中文español Deutsch English देवनागरीالعربيةportuguês বাংলাрусский 日本語norsk bokmål ਪੰਜਾਬੀ한국어தமிழ்עברית Български“
‘127’
`another string in backticks`

Допуска се използване на кавички вътре в низ, ако те не отговарят на ограждащите низа кавички:

Пример:

var answer = It’s alright;
var answer = He is called ‘Johnny’„;
var answer = He is called „Johnny“;

Използване на backticks

Те позволяват да вмъкнем стойност на променлива, израз или функция в низ. Пример:

let a = 3, b = 12;
console.log(`Сумата на ${a} и ${b} е ${a+b}.`)
//log: Сумата на 3 и 12 е 15.

Друго предимство на backticks е възможността за създаване на многоредов низ. Пример:

console.log(`Списък на класа:
Иван Маринов,
Атанас Петров,
Катя Василева.`)

//log: Списък на класа:
Иван Маринов,
Атанас Петров,
Катя Василева.

Дължина на низ

Дължината на низ, или броя символи, съдържащи се в него, можем да прочетем с помощта на вграденото свойство lenght.

let myString = ‘AbCdEf’;
let stringLength = myString.length;
console.log(stringLength); //log 6

Специални символи

В случай, че използваме в низа кавички, като ограждащите го, ще получим съобщение за грешка:
Пример:

let x = „We are the so-called „Vikings“ from the north.“;
console.log(x); //log Synta
xError: unexpected token: identifier

Решението на този проблем е използване на backslash escape character ( \ )

let x = „We are the so-called \“Vikings\“ from the north.“;
console.log(x); //log 
We are the so-called „Vikings“ from the north.

Някои по-важни искейп последователности:

КодИзход
\’единична кавичка ‘
\“двойни кавички „
\\обратно наклонена черта (backslash) \
\nнов ред
\rcarriage return (браузърите го заместват с \r\n )
carriage return (връщане на каретката) всъщност идва от
старите команди на принтерите. Връщането на каретката
означава „изпрати касетата на принтера обратно в

началото на реда“, а подаването на ред (или нов ред)
означава „преминете към следващия ред на страницата“.

\tтабулация
\bbackspace

Пример:

const x = „We are the so-called\t\“Vikings\“\tfrom\n\tthe north.“;
console.log(x);

Индексиране на низ (обръщения към символите в низ)

Низът може да се разглежда като редица от символи, всеки от които е свързан с номер, отговарящ на мястото му в низа.
Номерацията на символите в низа започва от нула!
Пример:

position0123456789101112
myString =thisisastring

Можем да се обърнем към символ от низа по два начина:

Първи начин
След името на низа, в квадратни скоби посочваме позицията на търсения символ:

console.log(myString[0]); //log: t
console.log(myString[9]); //log: r

Втори начин
Чрез използване на charAt(позиция_на_символа):

console.log(myString.charAt(3)); //log: s

Разликата между двата метода е, че ако не бъде открит символ на съответната позиция, [] връща резултат undefined, а charAt() връща празен низ.

str[0]; \връща първия символ от низа str
str[str.length – 1];
\връща последния символ от низа str

Използвайки индексите на низа, можем да създаден цикъл, който последователно се обръща към всеки символ от низа позсредством
for … of конструкция:

for (let char of "Hello") {
  alert(char); // H,e,l,l,o (char последователно приема стойности "H", после "e", после "l" и т.н.)
}

Низовете не могат да се променят с Javascript

let str = 'Hi';
//следния код няма да подмени първия символ в низа 'H' с 'h'.
str[0] = 'h'; 
alert( str[0] ); // log: H
//За да подменим символа 'H' с 'h', трябва да подходим така:
let str = 'Hi';
str = 'h' + str[1];  // подменяме целия низ
alert( str ); //log: hi

Конвертиране към главни или малки букви.

toUpperCase() – конвертира към главни букви
toLowerCase() – конвертира към малки букви


Търсене на низ в низ

indexOf()

Методът indexOf() връща номера на позицията на първия символ на търсения низ в оригиналния низ, при ПЪРВОТО негово срещане, считано от ляво надясно. Следния код, ще върне резултат 7.

log 7

Важно!
JavaScript брои позициите на символите в низа от нула. Т.е. първия символ е на позиция 0, втория на позиция 1 и т.н. Интервалите са част от низа.

lastIndexOf()

Методът lastIndexOf() връща номера на позицията на първия символ на търсения низ в оригиналния низ, при ПОСЛЕДНОТО негово срещане, считано от ляво надясно.
lastIndexOf извършва търсенето в низа отзад напред.
Следния код, ще върне резултат 21.

И indexOf(), и lastIndexOf() връщат стойност -1 (минус едно), в случай че търсеният низ не бъде открит.

И двата метода приемат като втори параметър цяло число (между 0 и дължината на низа), което указва от коя позиция да започне търсенето.

indexOf() и lastIndexOf() са чувствителни към малки и главни букви!

let str = 'String and string';
console.log(str.indexOf('string')); // лог: 11

let str = 'String and string';
console.log(str.lastIndexOf('String')); //log: 0

Задача 1. Даден е низа myStr = ‘As sly as a fox, as strong as an ox’.
Да се претърси за низа target = ‘as’ в него и при всяко срещане, да се извежда позицията, на която е открит target.

let myStr = 'As sly as a fox, as strong as an ox';
let target = 'as';
let pos = 0;
while(pos<myStr.length) {
  let foundPos = myStr.indexOf(target, pos);
  //if (foundPos == -1) break;
  alert( `Found at ${foundPos}` );
  pos = foundPos + 1; 
}

search()

Методът search() петърсва низа за указана стойност и връща позицията от която тя се съдържа в низа. Резултата е същия като от indexOf.

search() не приема втори параметър за стартова позиция на търсенето
indexOf() не може да използва регулярни изрази при търсенето.

Регулярен израз (regular expression) е последователност от знаци, която задава шаблон за търсене. Много често такива шаблони се използват в алгоритми за претърсване на низове.
Примери:
Логическо „или“ | > gray|grey съвпада с „gray“ и „grey“.
Скоби > gray|grey и gr(a|e)y са еквивалентни шаблони, които описват множеството от двата низа „gray“ и „grey“.
? > Въпросителният знак означава нула или едно срещане на предходния елемент. Например colou?r съвпада с „color“ и „colour“.
* > Звездичката означава нула или повече срещания на предходния елемент. Например ab*c съвпада с „ac“, „abc“, „abbc“, „abbbc“ и т.н.

includes, startsWith, endsWith

По-модерният метод str.includes(substr, pos) връща true / false в зависимост от това дали str съдържа substr в себе си.
В случай, че претърсваме низ за съвпадение и не се нуждаем от неговото местонахождение, по-добрият избор е:

alert( "Widget with id".includes("Widget") ); // true

alert( "Hello".includes("Bye") ); // false

Опционално, можем да зададем втори аргумент, указващ позиция, от която да започне търсенето:

alert( "Midget".includes("id") ); // true
alert( "Midget".includes("id", 3) ); // false, from position 3 there is no "id"

Методите str.startsWith() и str.endsWith() правят точно това, което казват:

alert( "Widget".startsWith("Wid") ); // true, "Widget" starts with "Wid"
alert( "Widget".endsWith("get") );   // true, "Widget" ends with "get"

Извличане от низ

slice()

Методът slice() извлича част от низ и го записва в нов низ.
Приема два параметъра: стартова позиция и крайна позиция (крайната позиция не е включена в извличането).
Пример:

Ако параметрите са отрицателни числа, броенето се извършва от края към началото на низа.

Ако се пропусне вторият параметър, извлеченият низ е от стартовата позиция, до края на низа.

substring()

Методът substring() работи като slice(), но не приема параметри с отрицателни стойности. Отрицателните стойности се считат за нула.

substr()

str.substr(start [, length]);

Връща частта от низ започвайки от strart, с дадената дължина length.
За разлика от предишните методи, това ни позволява да определим дължината вместо крайната позиция:

let str = "stringify";
alert( str.substr(2, 4) ); // ring, from the 2nd position get 4 characters

Първият аргумент може да бъде отрицателен, за да броим позицията отзад напред:

let str = "stringify";
alert( str.substr(-4, 2) ); // gi, from the 4th position get 2 characters

Обобщено за трите метода

methodselects…negatives
slice(start, end)from start to end (not including end)allows negatives
substring(start, end)between start and endnegative values mean 0
substr(start, length)from start get length charactersallows negative start

Задача 2. Да се напише скрипт, който приема низ и го връща като променя първата му буква в главна.

Задача 3. Проверка за спам. Да се напише програма, която проверява даден текст за наличие на думите „печели“, „милион“ и „купи“. Ако се среща която и да е от тях, текста да се определи като спам с подходящо съобщение. В противен случай, текста да се изведе на екран.

Замяна на част от низ

replace()

Методът replace() заменя указана част от низа с друга.

Методът replace() не променя оригиналният низ. Той създава нов низ.

replace() заменя само първото открито съвпадение. Методът е чувствителен към малки и главни букви. За да игнорираме чувствителността към малки и главни букви, можем да използваме регулярния израз /i (insensitive). В този случай, кавичките на търсения низ се заменят с дясно наклонена черта.

Сливане на низове

Методът concat() може да се използва като заместител на оператора +

Премахване на интервали от двете страни на низ

trim()

Задача 4. Да се напише скрипт, който приема низ (str) и цяло число (maxLength). Ако дължината на низа е по-голяма от числото, съкращава низа добавяйки в края му „…“, така че дължината на новополучения низ да е равна на maxLength. Ако дължината на низа е по-малка или равна на maxLength, той не се обработва.
Пример:
Вход: „Методът concat() може да се използва“, 14
Изход: „Методът con…“
Вход: „Здравейте!“, 14
Изход: „Здравейте!“

Задача 5. Да се напише скрипт, който приема два низа и връща нов низ, който е съставен от двата низа разделени с интервал, като изрязва и разменя първите им два символа. (Да се приеме, че низовете са с дължина поне два символа.)
Пример:
Вход: „cold“, „rain“; Изход: „rald coin“;
Вход: „dog“, „dinner“; Изход: „dig donner“;

Задача 6. Да се напише скрипт, който приема низ и заменя всички срещания на първия му символ със „*“, като самия първи символ не се подменя.
Пример:
Вход: „bubble“ Изход: „bu**le“

Задача 7. Да се напише скрипт, който приема низ (една дума – англ.). Ако думата е с дължина по-малка от 3 символа, се извежда както е въведена. В противен случай, в края на думата се добавя „ing“. Ако думата вече завършва на „ing“, в края й се добавя „s“.
Пример:
Вход: „Cry“ Изход: „Crying“
Вход: „Crying“ Изход: „Cryings“

Задача 8. Да се напише програма, която приема от промпт низ, представляващ изречение с дължина не повече от 80 символа, завършващо с точка. Всяка дума е разделена от останалите с един интервал.
а/ Да се изведе броят на думите в изречението.
б/ Да се изведе броят на еднобуквените думи в изречението.

Задача 9. Да се преработи Задача 8, така че да приема повече от едно изречение, като премахва всички излишни интервали от низа.

Вход: “ Той е . А той не е . „
Изход: „Броят на думите в „Той е. А той не е.“ е 6. От тях еднобуквени – 3 „

Забележка: Само точките да се отчитат като препинателни знаци.

Задача 10. Да се напише програма, която приема от промпт низ (да се приеме, че низа е на английски и изписан само с малки букви). При първо срещане в низа на думите ‘not’ и ‘bad’, ако bad се намира след not, програмата заменя целия израз ‘not … bad’ с ‘good’.
Пример:
Вход: ‘this dinner is not so bad’ > Изход: ‘this dinner is good’
Вход: ‘bad or not bad’ > Изход: ‘bad or not bad’

Задача 11. Преработете задача 10 така, че независимо от броя срещания на ‘not’ и ‘bad’, ако има поне едно ‘bad’, което се намира след ‘not’, да замества цялата последователност от първото срещнато ‘not’, до последното срещнато ‘bad’ с ‘good’.
Пример:
Вход: ‘bad or not bad’ > Изход: ‘bad or good’