Просмотр полной версии : как реализовать замену подстроки в строке?
Revolter
04.12.2007, 01:51
есть строка ST. необходимо заменить все подстроки = S строкой = S1.
Для первого вхождения:
ST = ST.substr(1,ST.indexOf(S)-1) + S1 + ST.substr(ST.indexOf(S)+length(S)+1,length(ST))
это оптимальный код или есть альтернатива? если есть возможность, дайте полную функцию для замены всех S на S1 в ST.
DarkLight
04.12.2007, 01:56
ST = ST.split("S").join("S1");
Revolter
04.12.2007, 02:11
спасибо. а как узнать колличество вхождений S в ST ?
DarkLight
04.12.2007, 02:49
var ST:String = "aaaF djshf F dlfk Fgggg hhFg";
var S:String = "F";
var S1:String = "Z"
var tmp:Array = ST.split(S);
var numS:Number = tmp.length-1;//число вхождений
trace("Число вхожений строки "+S+" в строке "+ST+" : "+numS);
ST = tmp.join(S1);
trace("Строка после замены: "+ST);
Revolter
07.12.2007, 01:19
ST = ST.split("S").join("S1");
как сделать чтобы замена была нечувствительной к регистру букв?
Т.е. у меня такая ситуация:
ST = "Пример пример";
S = "пример";
S1 = "<font color=""#FF000"">"+S+"</font>";
ST = ST.split("S").join("S1");
Данный код выделит(заменит) только второе слово. Как сделать так чтобы выделялось и первое, причем без потери регистра букв?
Пройтись по обоим вариантам.
Revolter
07.12.2007, 10:20
Пройтись по обоим вариантам.
проблема в том что "Пример" может быть "ПриМеР", т.е. не известно где и сколько там будет заглавных букв. как тогда решить эту задачу?
Revolter
07.12.2007, 10:32
не подходит - важно сохранить регистр букв
Тогда пишите более сложный преобразователь.
проблема в том что "Пример" может быть "ПриМеР", т.е. не известно где и сколько там будет заглавных букв. как тогда решить эту задачу?
Я же сказал, сначала идете по "м", потом по "М".
Зачем сохранять регистр, если подстроки все равно будут удалены?
Автор, обьясни пожалуйста, почему String.toLowerCase() не устраивает?
Вот, наваял заодно что-то... ток зачем это нужно - не пойму %)
var search_str:String = "abcd";
var replace_str:String = "efgh";
var searched_str:String = "abcd, Abcd, abCD, dcba";
function strConvert(s_str:String, r_str:String, rp_str:String):String {
var i:Number = 0;
var rp_arr:Array = rp_str.split("");
while (i<s_str.length) {
var check_sum:String = "";
var mtx:Array = [];
while (s_str.charAt(i).toLowerCase() == r_str.charAt(0) || check_sum!="") {
check_sum += s_str.charAt(i);
if (s_str.charAt(i).toLowerCase() != s_str.charAt(i)) {
mtx.push(true);
} else {
mtx.push(false);
}
i++;
if(i>s_str.length)break;
if (check_sum.length == r_str.length) {
var j:Number = 0;
var sb_str:String = "";
while (j<rp_arr.length) {
mtx[j] ? sb_str += rp_arr[j].toUpperCase() : sb_str += rp_arr[j];
j++;
}
s_str = s_str.slice(0, i-r_str.length)+sb_str+s_str.slice(i, s_str.length);
mtx=[];
check_sum ="";
}
}
i++;
}
return s_str;
}
trace(strConvert(searched_str, search_str, replace_str));
Потому, что toLowerCase() заменит все символы в строке. А двойной проход будет работать быстрее, чем сложный код выше.
Я просто все равно не совсем понимаю, какого результата желает автор...
Пример: "Василий ПупкиН утоп."
меняем совпадения "пупкин" на "ло".
результат: "Василий Ло утоп". (от того, что последняя буква в фамилии была заглавной ничего не изменилось...
или так: "Все страны бывшего СССР пережили экономический кризис".
меняем "ссср" на "Советского Союза".
получаем: "Все страны бывшего СОВЕтского союза пережили экономический кризис".
Revolter
07.12.2007, 17:46
Я просто все равно не совсем понимаю, какого результата желает автор...
Пример: "Василий ПупкиН утоп."
меняем совпадения "пупкин" на "ло".
результат: "Василий Ло утоп". (от того, что последняя буква в фамилии была заглавной ничего не изменилось...
или так: "Все страны бывшего СССР пережили экономический кризис".
меняем "ссср" на "Советского Союза".
получаем: "Все страны бывшего СОВЕтского союза пережили экономический кризис".
У меня реализован поиск - сообщается сколько искомых строк найдено в файлах поиска. Далее юзер выбирает какой файл просмотреть. Файл загружается в TextField с включенным html. Искомое слово выделяется цветом - <font color="#0000FF">искомое слово</font>. Проблема в том, чтобы сделать эту замену нечувствительной к регистру. То есть чтобы "ИсКОмОе СЛоВо" менял на "<font color="#0000FF">ИсКОмОе СЛоВо</font>" и т.п.
сделал (allT - текст где надо выделить search_str):
function mark(allT:String;search_str:String){
lenT = length(allT);
allTemp = allT.toLowerCase();
searchTemp = search_str.toLowerCase();
slen = length(search_str);
num = 0; // с какой позиции искать
n = 0; // кол-во найденых
index = allTemp.indexOf(searchTemp, num); // индекс текущего вхождения
while (index>=0) {
allT = allT.substr(0,index + n*29) + '<font color="#0000FF">' + allT.substr(index+n*29,slen) + '</font>' + allT.substr(index+slen+n*29 ,length(allT));
n++;
num = index+slen;
index = allTemp.indexOf(searchTemp, num); // индекс текущего вхождения
};
return allT
};
var given_str:String = "<font color='#008080'>Hier kommt die Sonne, Hier kommt die Sonne. Rammstein (c)</font>";
var search_str:String = "sOnNe";
var _txt:TextField = _root.createTextField("_txt",0,0,0,200,200);
_txt.border = true;
_txt.multiline = true;
_txt.wordWrap = true;
_txt.html = true;
_txt.htmlText = given_str;
function searchAndReplace(s_str:String, r_str:String):String {
r_str = r_str.toLowerCase();
var n:Number = 0;
var i:Number = 0;
var j:Number = 0;
while(i<s_str.length){
if(s_str.charAt(i).toLowerCase()==r_str.charAt(0) || n!=0){
trace("found at "+i+" | "+s_str.charAt(i));
if (s_str.charAt(i).toLowerCase() == r_str.charAt(j)){
trace("processing "+s_str.charAt(i).toLowerCase());
n++;
j++;
} else {
n=0;
}
if(n == r_str.length){
s_str = s_str.slice(0,i-r_str.length)+"<font color='#800000'>"+s_str.slice(i-r_str.length,i+1)+"</font>"+s_str.slice(i+1,s_str.length);
i+=29+n;
n=0;
j=0;
}
}
i++;
}
return s_str;
}
_txt.htmlText = searchAndReplace(given_str,search_str);Ну, как вариант
не подходит - важно сохранить регистр букв
Я не заставляю вас менять регистр в исходной строке, можно же создать дубликат этой строки. По ней уже поискать.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.