PDA

Просмотр полной версии : Поиск и замена слова


razve
26.06.2014, 18:40
Помогите, пожалуйста, решить такую проблему.
В текстовом поле нахожу слово и заменяю его. Но меняется также и часть другого слова, которое содержит в себе искомое. Как мне определить, что длина слова "круглый" не равна длине "круг" и поэтому замену в этом слове производить не нужно?

much = 0;
t.text = "круг, круглый мяч";
arr = new Array("круг");
function changemain() {
for (i=0; i<=t.text.length; i++) {
var bin = t.text.indexOf(arr[0], much);
var bon = bin+arr[0].length;
much = bon;
t.replaceText(bin, bon, "квадрат");
much = 0;
}
}
changemain();

caseyryan
27.06.2014, 07:41
С помощью регулярных выражений.
Вот тут (www.jurjans.lv/flash/RegExp.html)чувак писал класс RegExp для AS2
Правда для русских букв его придется проапгрейдить, так как он рассчитан только на латиницу

dark256
27.06.2014, 11:00
Вот. Не слишком элегантно, но отладил и работает.

// Набор НЕбукв (включая пробел)
var delimiters:Array = ",._ -+?(){}[]".split("")

// Хэш-объект для проверки на принадлежность символа к разделителям без перебора
// ВСЕХ описанных разделителей
var delHash:Object = new Object()
// Формируем хэш-объект
for ( var i=0; i<delimiters.length; i++ ) delHash[ delimiters[i] ] = true


// Проверка символа на принадлежность к разделителям
function charIsDelimiter( char ){
if ( delHash[char] == true ) return false; else return true;
}

function searchAndReplace( src, from, to ){

trace( "\n SOURCE STRING:"+src )

var idx
var pos = 0
do
{
idx = src.indexOf( from, pos )
if ( idx >=0 ){
pos = idx+from.length

var leftChar = false
var rightChar = false

// Проверяем крайние символы слова на разделители, если их индексы
// лежат в диапазоне граничных индексов строки
if ( idx !=0 ) leftChar = charIsDelimiter( src.charAt( idx-1 ) )
if ( idx+from.length != src.length ) rightChar = charIsDelimiter( src.charAt( idx+from.length ) )

if ( !leftChar && !rightChar ) src = src.substr(0,idx)+to+src.substr(idx+from.length, src.length)
}
}
while ( idx!=-1 )
// Продолжаем поиск по строке, пока искомая сигнатура в ней не перестанет находиться

trace( "RESAULT STRING:"+src )
}


var sourceText = "круг, круглый, __круг___кругляшок, округлый, (круг";

searchAndReplace( sourceText, "круг","квадрат" )


SOURCE STRING:круг, круглый, __круг___кругляшок, округлый, (круг
RESAULT STRING:квадрат, круглый, __квадрат___кругляшок, округлый, (квадрат

razve
27.06.2014, 11:29
Спасибо за ответы!


Вот тут (www.jurjans.lv/flash/RegExp.html)чувак писал класс RegExp для AS2
я новичок, не осилю, мне бы в примере dark256 разобраться)

dark256
27.06.2014, 11:58
Не надо разбираться - бери да юзай. :)

razve
28.06.2014, 12:42
Не надо разбираться - бери да юзай. :)
Легко сказать) стоит поменять условия и у меня уже возникают проблемы.
Так работает.
arr = new Array(['круг', ['квадрат']],['овал',['треугольник']]);
searchAndReplace(sourceText, arr[0][0], arr[0][1]);
А так почему-то нет.
arr = new Array(['круг', ['квадрат']],['овал',['треугольник']]);
for (j=0; j<=sourceText.length; j++) {
searchAndReplace(sourceText, arr[j][0], arr[j][1]);
}

razve
04.07.2014, 19:11
dark256, еще раз спасибо, вроде разобрался:

var sourceText = "круг, круглый, __круг___кругляшок. округлый, (круг, овал овальный, полумесяц сфера, цилиндр цилиндрический, тор";
arr = new Array(['круг','овал','полумесяц'], ['сфера','цилиндр','тор']);
arrz = new Array(['квадрат','треугольник','прямоугольник'], ['пирамида','конус','параллепипед']);
var delimiters:Array = ",._ -+?(){}[]".split("");
var delHash:Object = new Object();
for (var i = 0; i<delimiters.length; i++) {
delHash[delimiters[i]] = true;
}
function charIsDelimiter(char) {
if (delHash[char] == true) {
return false;
} else {
return true;
}
}
function searchAndReplace() {
trace("\n SOURCE STRING:"+sourceText);
var idx;
var pos = 0;
for (i=0; i<=sourceText.length; i++) {
for (j=0; j<=sourceText.length; j++) {
do {
idx = sourceText.indexOf(arr[i][j], pos);
var r:Number = Math.floor(Math.random()*arrz[i].length);
if (idx>=0) {
pos = idx+arr[i][j].length;
var leftChar = false;
var rightChar = false;
if (idx != 0) {
leftChar = charIsDelimiter(sourceText.charAt(idx-1));
}
if (idx+arr[i][j].length != sourceText.length) {
rightChar = charIsDelimiter(sourceText.charAt(idx+arr[i][j].length));
}
if (!leftChar && !rightChar) {
sourceText = sourceText.substr(0, idx)+arrz[i][r]+sourceText.substr(idx+arr[i][j].length, sourceText.length);
}
}
} while (idx != -1);

}
}
trace("RESAULT STRING:"+sourceText);
}
searchAndReplace();


Добавлено через 64 часа 46 минут
Не получается( При перестановке в массиве, слово (например, "круг") не ищет.
Исходный массив:

arr = new Array(['овал', 'круг' ,'полумесяц'], ['сфера','цилиндр','тор']);

Ни так:

arr = new Array(['овал', 'круг' ,'полумесяц'], ['сфера','цилиндр','тор']);

Ни так:

arr = new Array(['овал','полумесяц'], ['сфера','цилиндр','тор'],['круг']);

dark256
10.07.2014, 11:31
Я, к сожалению, не могу до сих пор понять смысла подобных входных данных.......
Посомтреть код смогу только ближе к вечеру.
Пока опишите суть и смысл подобных массиово на входе...

razve
10.07.2014, 14:56
arr = new Array(['круг','овал' ,'полумесяц'], ['сфера','цилиндр','тор']);

Смысл такой.
Найти в тексте все слова из arr[0] (это будут схожие по смыслу слова) и заменить их на рандомное слово из arrz[0], затем из arr[1] на arrz[1] и т.д.