AS3 / Регулярные выражения - замена сегментов строки - PullRequest
0 голосов
/ 06 июня 2011

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

package avian.framework.errors 
{
    public class AvError extends Object
    {
        // errors
        public static const LAYER_WARNING:String = "Warning: {0} is not a valid layer - the default layer _fallback_ has been used as the container for {1}.";

        /**
         * Constructor
         * Places a warning or error into the output console to assist with misuse of the framework
         * @param err The error to display
         * @param params A list of Objects to use throughout the error message
         */
        public function AvError(err:String, ...params)
        {
            trace(err);
        }
    }
}

Что я хочу сделать, так это использовать LAYER_WARNING:

new AvError(AvError.LAYER_WARNING, targetLayer, this);

И результат будет примерно таким:

Warning: randomLayer is not a valid layer - the default layer _fallback_ has been used as the container for [object AvChild].

Идея состоит в том, чтобы заменить {0} первым параметром, проанализированным в ...params, {1} вторым и т. Д.


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

var pattern:RegExp = /{\d}/;

Ответы [ 3 ]

0 голосов
/ 06 июня 2011

Используя флаг g в RegExp, вы можете создать массив, содержащий все ваши {x} совпадения, затем пройти по этому массиву и заменить каждое из совпадений соответствующим параметром.

Код:

var mystring:String = "{0} went to {1} on {2}";

function replace(str:String, ...params):String
{
    var pattern:RegExp = /{\d}/g;
    var ar:Array = str.match(pattern);

    var i:uint = 0;
    for(i; i<ar.length; i++)
    {
        str = str.split(ar[i]).join(params[i]);
    }

    return str;
}

trace(replace(mystring, "marty", "work", "friday")); // marty went to work on friday
0 голосов
/ 06 июня 2011

Я предполагаю, что вы хотите иметь несколько статических констант с различными экземплярами замены ({0}, {1}, {2} и т. Д.) В каждой строковой константе.

что-то вроде этого должно работать - извините, это не проверено:

public function AvError(err:String, ...params)
{
        var replacementArray:Array = err.match(new RegExp("{\\d}", "g"));

        for (var i:int = 0, i < replacementArray.length, i++)
            err = err.replace(new RegExp(replacementArray[i], "g"), params[i]);

        trace(err);
}

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

0 голосов
/ 06 июня 2011

Вы можете использовать StringUtil

var original:String = "Here is my {0} and my {1}!";
var myStr:String    = StringUtil.substitute(original, ['first', 'second']);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...