Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Поиск и замена слова (http://www.flasher.ru/forum/showthread.php?t=208298)

razve 26.06.2014 18:40

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

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

С помощью регулярных выражений.
Вот тут чувак писал класс RegExp для AS2
Правда для русских букв его придется проапгрейдить, так как он рассчитан только на латиницу

dark256 27.06.2014 11:00

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

Код AS1/AS2:

// Набор НЕбукв (включая пробел) 
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

Спасибо за ответы!

Цитата:

Сообщение от caseyryan (Сообщение 1168378)
Вот тут чувак писал класс RegExp для AS2

я новичок, не осилю, мне бы в примере dark256 разобраться)

dark256 27.06.2014 11:58

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

razve 28.06.2014 12:42

Цитата:

Сообщение от dark256 (Сообщение 1168396)
Не надо разбираться - бери да юзай. :)

Легко сказать) стоит поменять условия и у меня уже возникают проблемы.
Так работает.
Код AS1/AS2:

arr = new Array(['круг', ['квадрат']],['овал',['треугольник']]);
searchAndReplace(sourceText, arr[0][0], arr[0][1]);

А так почему-то нет.
Код AS1/AS2:

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, еще раз спасибо, вроде разобрался:
Код AS1/AS2:

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 минут
Не получается( При перестановке в массиве, слово (например, "круг") не ищет.
Исходный массив:
Код AS1/AS2:

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

Ни так:
Код AS1/AS2:

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

Ни так:
Код AS1/AS2:

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


dark256 10.07.2014 11:31

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

razve 10.07.2014 14:56

Код AS1/AS2:

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

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


Часовой пояс GMT +4, время: 19:38.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.