Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Получение частей строки, заключенных между двумя подстроками (https://javascript.ru/forum/misc/37001-poluchenie-chastejj-stroki-zaklyuchennykh-mezhdu-dvumya-podstrokami.html)

Tie 03.04.2013 19:40

Получение частей строки, заключенных между двумя подстроками
 
Здравствуйте!

Столкнулся со следующей задачей. Нужна функция, получающая в массив все куски строки, находящиеся между двух заданных строк. Совсем замучился, не получается написать.
Приведу пример в виде кода:

function myFunc(text, start, finish) {
	...
}

var testText = "привет меня зовут Вася. привет и меня тоже зовут Вася";
var arr = myFunc(testText, 'привет', 'Вася');
// arr должен получиться [' меня зовут ',' и меня тоже зовут ']


Не могли бы вы мне подсказать, как это реализовать?

SV0L0CH 03.04.2013 19:49

По заданым строкам составить регулярное выражение и по нему искать.

Aetae 04.04.2013 01:47

Цитата:

Сообщение от SV0L0CH (Сообщение 244166)
По заданым строкам составить регулярное выражение и по нему искать.

Ну тут какбэ и indexOf обойтись можно.)

ksa 04.04.2013 08:40

Цитата:

Сообщение от Tie
Нужна функция, получающая в массив все куски строки, находящиеся между двух заданных строк

Как вариант...

var txt = "привет меня зовут Вася. привет и меня тоже зовут Вася";
var a=txtToArray(txt);
alert(a);
function txtToArray(Txt) {
	var a=txt.split('привет');
	var b=[];
	for (var i=1; i<a.length; i++) {
		b[b.length]=a[i].split('Вася')[0];
	};
	return b;
};

rgl 04.04.2013 10:12

Цитата:

Сообщение от ksa (Сообщение 244206)
Как вариант...

var txt = "привет меня зовут Вася. привет и меня тоже зовут Вася";
var a=txtToArray(txt);
alert(a);
function txtToArray(Txt) {
	var a=txt.split('привет');
	var b=[];
	for (var i=1; i<a.length; i++) {
		b[b.length]=a[i].split('Вася')[0];
	};
	return b;
};

var txt = "привет меня зовут Вася. привет, а меня зовут Федя.";
var a=txtToArray(txt);
alert(a);
function txtToArray(Txt) {
	var a=txt.split('привет');
	var b=[];
	for (var i=1; i<a.length; i++) {
		b[b.length]=a[i].split('Вася')[0];
	};
	return b;
};

ksa 04.04.2013 10:17

rgl, да ты просто вскрыл нарыв! :lol:

rgl 04.04.2013 10:32

Tie,
Что-бы что-то сделать, нужно более точное условие. Что делать в случае:
"привет-привет меня зовут Вася. привет и меня тоже зовут Вася, да-да, тоже Вася"
Считать началом первый "привет" или второй? И на каком из Васей останавливаться?

ksa 04.04.2013 10:39

Предложу такой, обновлённый вариант :lol:

var txt = "привет меня зовут Вася. привет, а меня зовут Федя.";
var a=txtToArray(txt);
alert(a);
txt = "привет-привет меня зовут Вася. привет и меня тоже зовут Вася, да-да, тоже Вася";
a=txtToArray(txt);
alert(a);
function txtToArray(Txt) {
	var a=txt.split('привет');
	var b=[];
	var c;
	for (var i=1; i<a.length; i++) {
		c=a[i].split('Вася');
		if (c.length>1) b[b.length]=c[0];
	};
	return b;
};

Tie 04.04.2013 18:11

Спасибо огромное!

Принцип понял, дальше сделаем :)
Вообще, для уточнения условий - ищем первый "привет", потом первого "Васю" - вытаскиваем то что между. Потом второй "привет" и второго "Васю"... Ну и т.д.

Aetae 04.04.2013 23:49

На ваш вкус.)
function searchBetween(str, first, second){
    var fl = first.length,
        sl = second.length,
        f, s = -sl,
        arr =[];
    while((f = str.indexOf(first, s+sl)) !== -1 && (s = str.indexOf(second,f+fl)) !== -1  ){
        arr.push(str.slice(f+fl, s))
    }
    return arr
}

function searchBetweenReg(str, first, second){
    function escape(str) {
        return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
    }
    var result = [],
        arr = str.split(new RegExp(escape(first) + '([\\s\\S]*?)' + escape(second),''));
    for(var i=1, l = arr.length; i<l; i+=2 ) result.push(arr[i]);
    return result
}

function searchBetweenReg2(str, first, second){
    function escape(str) {
        return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
    }
    var reg = new RegExp( escape(first) + '([\\s\\S]*?)' + escape(second),'g'),
        arr = [],
        sub;
    while((sub = reg.exec(str)) !== null) arr.push(sub[1]);
    return arr
}

rgl 05.04.2013 18:05

Цитата:

Сообщение от Aetae (Сообщение 244196)
Ну тут какбэ и indexOf обойтись можно.)

Цитата:

Сообщение от Aetae (Сообщение 244327)
// ......................
        return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
// ......................

:D :D :D :D :D

А если серьезно, позволю себе пару комментариев:
1. Внутри классов почти ничего маскировать не нужно. Правда, иногда для этого все должно быть на своих местах. Не нужно маскировать скобку [ если она в самом начале или после символа отрицания ^, не нужно маскировать ^ если ставить этот символ не в самое начало, не нужно маскировать минус, если ставить его в начале или в конце (но начало уже занято [ поэтому ставим в конце), остальные символы (кроме \ и возможно /) просто маскировать не нужно. Поэтому в итоге получаем:
//      return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
        return str.replace(/[][\/{}()*+?.\\^$|]/g, "\\$&");

2. Вариант searchBetweenReg полагается на то, что split добавляет в результирующий массив подгруппы (т.е. кусочки в скобочках) а это может быть так, а может и не быть, т.е. получается непереносимо. Значит остается первый и третий вариант.

Deff 05.04.2013 23:40

var txt = "привет меня зовут Вася. привет и меня тоже зовут Вася";
txt = txt.replace(/Вася(?:.(?!привет)*).привет/img,'=ВасПрив=')
txt = txt.split(/=ВасПрив=|привет|Вася/);
txt.splice(0,1);
txt.splice(-1,1)
alert(txt)

rgl 06.04.2013 00:31

Цитата:

Сообщение от Deff (Сообщение 244478)
var txt = "привет меня зовут Вася. привет и меня тоже зовут Вася";
txt = txt.replace(/Вася(?:.(?!привет)*).привет/img,'=ВасПрив=')
txt = txt.split(/=ВасПрив=|привет|Вася/);
txt.splice(0,1);
txt.splice(-1,1)
alert(txt)

var txt = "привет меня зовут Вася. (хи-хи) привет и меня тоже зовут Вася";
txt = txt.replace(/Вася(?:.(?!привет)*).привет/img,'=ВасПрив=')
txt = txt.split(/=ВасПрив=|привет|Вася/);
txt.splice(0,1);
txt.splice(-1,1)
alert(txt)

Deff 06.04.2013 00:37

var txt = "привет меня зовут Вася. (хи-хи) привет и меня тоже зовут Вася";
txt = txt.replace(/Вася(?:.(?!привет))*.привет/img,'=ВасПрив=')
txt = txt.split(/=ВасПрив=|привет|Вася/);
txt.splice(0,1);
txt.splice(-1,1)
alert(txt)

rgl 06.04.2013 00:49

В любом случае - непереносимо. Напоминаю:
http://javascript.ru/forum/misc/3600...tml#post238235

Я к тому, что
txt.splice(0,1);
txt.splice(-1,1)
может быть нужно, а может и нет

Aetae 07.04.2013 08:24

split в ie<8 лечится как и всё остальное - подключением эмуляции.


Часовой пояс GMT +3, время: 08:13.