Форум 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)
-   -   Split строки по шаблону (http://www.flasher.ru/forum/showthread.php?t=171204)

Olesolo 11.11.2011 13:00

Split строки по шаблону
 
доброе утро всем,
какой шаблон использовать чтобы разбить строку по точкам и запятым?
Например: "Вы можете выбрать иконку, характеризующую сообщение. Разделяйте теги запятыми."
Результат: "Вы можете выбрать иконку,", "характеризующую сообщение.", "Разделяйте теги запятыми."
пробовал split({.,}) не работает :\

mooncar 11.11.2011 13:32

Решение "в лоб":
Код AS1/AS2:

var str:String = 'Вы можете выбрать иконку, характеризующую сообщение. Разделяйте теги запятыми,это важно.';
 
str = str.split(', ').join(','); //убираем из последовательностей ', ' пробел
str = str.split(',').join('###'); //заменяем все возможные ',' на спецсимвол ###
str = str.split('###').join(',###'); //возвращаем запятую перед спецсимволом ###
 
str = str.split('. ').join('.'); //убираем из последовательностей '. ' пробел
str = str.split('.').join('####'); //заменяем все возможные '.' на другой спецсимвол ####
str = str.split('####').join('.####'); //возвращаем точку перед другим спецсимволом ####
 
str = str.split('####').join('###'); //приводим все спецсимволы к одному виду
 
var arr:Array = str.split('###'); //бьем строку на результирующий массив
 
for (var i = 0; i < arr.length ; i++)
{
    trace(arr[i]);
}

Решение учитывает и возможно пропущенные пробелы после запятых и точек.
Интересны были бы более оптимальные варианты, если кто-то даст.

dark256 11.11.2011 14:27

Кстати не слишком тривиальная задачка. Можно слегка сделать более общее решение разве что.
Код AS1/AS2:

var STR =  "Вы можете перевести сумму, характеризующую степень помощи. Храните деньги в сбербанке.";
var REZ : Array = new Array();
 
function removeChars( input, shablon ){
        for ( var J=0; J<shablon.length; J++ ) input = input.split(shablon[J]).join("###");
        return input.split("###")
}
 
REZ = removeChars(STR,[", ",". ",",","."])
 
for ( var i=0; i<REZ.length; i++ ) trace( REZ[i])


DaFive 11.11.2011 14:29

На AS 3.0 есть метод replace для строки, а в as 2.0 - чтобы не писать кучу джоинов -
завести метод:
Код AS3:

String.prototype.replace = function(searchStr, replaceStr):String {        
    var arr:Array = this.split(searchStr);
    return arr.join(replaceStr);
};


crazyone 11.11.2011 14:58

Мункар, это решение не "в лоб", а "в печень" =)
Даже если через split/join, то зачем же после ввода собственного спецсимвола вводить еще один, а потом менять его на что-то и еще раз на что-то.

А вобще - нужно юзать регекспы. Они не сложные, правда-правда.
Банально:

Код AS3:

var res:Array = text.split(/\.\s*|,\s*/);

Если нужно не терять точки и запятые, прийдется немного усложнить:

Код AS3:

var res:Array = text.split(/(.*?[\.|,])\s*/);

Но тогда в полученном массиве найденные элементы будут чередоваться с разделителями, т.е.:
Код:

0 :''
1 :'Вы можете выбрать иконку,'
2 :''
3 :'характеризующую сообщение.'
4 :''
5 :'Разделяйте теги запятыми.'
6 :''

Можно сделать немного иначе:
Код AS3:

var res:Array = text.split(/([\.|,])\s*/);

Получим вот такой массивчик:
Код:

0 :'Вы можете выбрать иконку'
1 :','
2 :'характеризующую сообщение'
3 :'.'
4 :'Разделяйте теги запятыми'
5 :'.'
6 :''

Ну и потом посклеиваем все, что нам надо.

Olesolo 11.11.2011 16:02

crazyone
решение ищется именно для AS2.0

mooncar 11.11.2011 16:17

Olesolo, как вам мое решение?

dark256, у тебя условия задачки не выполнены, не сохраняются точки и запятые, они просто вырезаются, это как раз тривиально.

Цитата:

Сообщение от crazyone (Сообщение 1045317)
Мункар, это решение не "в лоб", а "в печень" =)
Даже если через split/join, то зачем же после ввода собственного спецсимвола вводить еще один, а потом менять его на что-то и еще раз на что-то.

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

1. Первый спецсимовл в моем решении возникает на месте последовательностей "запятая-пробел" и на месте "запятая", при этом образуется последовательность "запятая-спецсимвол-№1".
2. Второй спецсимовл появляется на месте последовательностей "точка-пробел" и на месте "точка", при этом образуется последовательность "точка-спецсимвол-№2".
Причем использовать тот же спецсимвол, что и в п.1 нельзя, поскольку предстоит еще обратная замена на точку, то есть точка-спецсимвол-№2 будут именно в месте второго спецсимовла.
3. И на третьем этапе идет подготовка на разбиение в массив, для этого спецсимвол №2 теперь уже можно заменить на спецсимвол №1, унифицировав разметку для разбиения, поскольку точки уже встали на свои места. И сделать наконец split.

Про регулярки я знал, но не силен в них.

crazyone 11.11.2011 16:52

Да, в AS2 с этим грустнее. Недосмотрел расположение темы.

Мункар, я говорил о том, что если сделать вот так, результат не поменяется, а сплит-джойнов будет меньше:
Код AS1/AS2:

var str:String = 'Вы можете выбрать иконку, характеризующую сообщение. Разделяйте теги запятыми,это важно.';
 
str = str.split(', ').join(','); //убираем из последовательностей ', ' пробел
str = str.split(',').join(',###'); //заменяем все возможные ',' на спецсимвол ,###
 
str = str.split('. ').join('.'); //убираем из последовательностей '. ' пробел
str = str.split('.').join('.###'); //заменяем все возможные '.' на другой спецсимвол .###
 
var arr:Array = str.split('###'); //бьем строку на результирующий массив
 
for (var i = 0; i < arr.length ; i++)
{
    trace(arr[i]);
}


mooncar 11.11.2011 17:11

Ага, результат такой же, я тоже так собирался, только почему-то логика замен не получалась.


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

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