Apache flex 将replaceAll方法添加到ActionScript字符串类

Apache flex 将replaceAll方法添加到ActionScript字符串类,apache-flex,actionscript-3,oop,actionscript,Apache Flex,Actionscript 3,Oop,Actionscript,我需要一些帮助来将replaceall功能添加到我的Flex项目中。我更愿意以一种尽可能自然的方式来做这件事 我想要实现的是能够使用Flex编译器aabbaaba.replaceAllb,c运行这段代码,并获得aaccaaca。此外,我还想连接所有呼叫。 注意:我实际上不会用cs替换bs,而是在编码时不知道的各种字符串 我不想要的是: 1.使用带有全局标志的正则表达式。要替换的标记是在运行时确定的,将它们转换为正则表达式并不是直接的。 2.使用StringUtil.replace方法。这是一种静

我需要一些帮助来将replaceall功能添加到我的Flex项目中。我更愿意以一种尽可能自然的方式来做这件事

我想要实现的是能够使用Flex编译器aabbaaba.replaceAllb,c运行这段代码,并获得aaccaaca。此外,我还想连接所有呼叫。 注意:我实际上不会用cs替换bs,而是在编码时不知道的各种字符串

我不想要的是: 1.使用带有全局标志的正则表达式。要替换的标记是在运行时确定的,将它们转换为正则表达式并不是直接的。 2.使用StringUtil.replace方法。这是一种静态方法,链接很难看。 3.链拆分和连接。因为阅读代码时可能会让其他人感到困惑。 4.禁用严格的类型检查。我想对剩下的代码进行类型检查

以下是我到目前为止的情况:

String.prototype.replaceAll = function(replace:String, replaceWith:String):String{
    return this.split(replace).join(replaceWith);
}
可以这样称呼:

"aababacaaccb"["replaceAll"]("b", "c")["replaceAll"]("c", "a");
另外,有没有建议不要通过原型扩展对象?我还将接受一个答案,该答案有强烈的理由反对通过原型扩展String对象

谢谢,, Alin

aabbaaba.split'b'。join'c'返回'aaccaaca'

UPD: 我想知道为什么它对您来说是不可接受的,但是它不支持regexp:它工作得非常快,在严重的循环中检查它,并且完全按照您的要求执行


还有一些解决方案在你的黑名单中没有提到,顺便说一句,静态函数比混用原型更好-imho:

您可以仅使用replaceAll方法和超级调用来扩展String类。如果您检查myStringInstance为String,则该类的实例将返回true 还有另一个解决方案:创建一个包装器而不是扩展:一个将为您存储字符串的类提供额外的功能,尽管我无法想象一个用于字符串的包装器,并且可能使其某些属性为只读。或者它可能只有一个getter和setter aabbaaba.split'b'。join'c'返回'aaccaaca'

UPD: 我想知道为什么它对您来说是不可接受的,但是它不支持regexp:它工作得非常快,在严重的循环中检查它,并且完全按照您的要求执行


还有一些解决方案在你的黑名单中没有提到,顺便说一句,静态函数比混用原型更好-imho:

您可以仅使用replaceAll方法和超级调用来扩展String类。如果您检查myStringInstance为String,则该类的实例将返回true 还有另一个解决方案:创建一个包装器而不是扩展:一个将为您存储字符串的类提供额外的功能,尽管我无法想象一个用于字符串的包装器,并且可能使其某些属性为只读。或者它可能只有一个getter和setter 我不想要的是: 1.使用带有全局标志的正则表达式

为什么不呢?对于简单的字符串替换,这是非常直接和有效的:

"aababacaaccb".replace(/b/g, "c");
或者,如果您愿意:

var needle:String="b";
"aababacaaccb".replace(new RegExp(needle,"g"), "c");
我不建议为此使用原型,它不是非常面向对象的,也不是标准的。。。这样一个简单的操作感觉太粗糙了

我不想要的是: 1.使用带有全局标志的正则表达式

为什么不呢?对于简单的字符串替换,这是非常直接和有效的:

"aababacaaccb".replace(/b/g, "c");
或者,如果您愿意:

var needle:String="b";
"aababacaaccb".replace(new RegExp(needle,"g"), "c");

我不建议为此使用原型,它不是非常面向对象的,也不是标准的。。。这样一个简单的操作感觉太粗糙了。

我有两个答案给你。第一个是你想要的。但我推荐第二种

在flex中启用原型非常简单,可以通过设置flex配置来完成

ReplaceAllTest.as

package {
    import flash.display.Sprite;
    import flash.text.TextField;
    public class ReplaceAllTest extends Sprite
    {
        public function ReplaceAllTest() 
        {
            var tf:TextField = new TextField;
            String.prototype.replaceAll = function(replace:String, replaceWith:String):String{
                return this.split(replace).join(replaceWith);
            }
            // now the strict mode is off compiler does NOT warn the following code
            tf.text = "aababacaaccb".replaceAll("b", "c")
                                    .replaceAll("c", "a");
            addChild(tf);
        }
    }
}
ReplaceAllTest-config.xml

<?xml version="1.0" encoding="utf-8" ?>
<flex-config>
    <compiler>
       <as3>false</as3>
       <es>true</es>
       <strict>false</strict>
    </compiler>
    <static-link-runtime-shared-libraries>true</static-link-runtime-shared-libraries>
</flex-config>

我仍然不鼓励这样做,因为启用原型设计并关闭严格模式会降低代码的速度。

我有两个答案供您参考。第一个是你想要的。但我推荐第二种

在flex中启用原型非常简单,可以通过设置flex配置来完成

ReplaceAllTest.as

package {
    import flash.display.Sprite;
    import flash.text.TextField;
    public class ReplaceAllTest extends Sprite
    {
        public function ReplaceAllTest() 
        {
            var tf:TextField = new TextField;
            String.prototype.replaceAll = function(replace:String, replaceWith:String):String{
                return this.split(replace).join(replaceWith);
            }
            // now the strict mode is off compiler does NOT warn the following code
            tf.text = "aababacaaccb".replaceAll("b", "c")
                                    .replaceAll("c", "a");
            addChild(tf);
        }
    }
}
ReplaceAllTest-config.xml

<?xml version="1.0" encoding="utf-8" ?>
<flex-config>
    <compiler>
       <as3>false</as3>
       <es>true</es>
       <strict>false</strict>
    </compiler>
    <static-link-runtime-shared-libraries>true</static-link-runtime-shared-libraries>
</flex-config>

我仍然不鼓励这样做,因为启用原型设计并关闭严格模式会降低代码的速度。

第二个答案是:

为String编写包装类StringEx,您可以像下面这样定义要链接的replaceAll

public function replaceAll(replace:String, replaceWith:String):StringEx {
   string = string.replace(new RegExp(replace, 'g'), replaceWith);
   return this;
}
通过提供toString,您可以轻松地将StringEx对象更改为String

var result:String = "" + new StringEx("aaccaaca").replaceAll('b', 'c').replaceAll('c', 'a');

您可以在此处获得完整版本:

第二个答案是:

为String编写包装类StringEx,您可以像下面这样定义要链接的replaceAll

public function replaceAll(replace:String, replaceWith:String):StringEx {
   string = string.replace(new RegExp(replace, 'g'), replaceWith);
   return this;
}
通过提供toString,您可以轻松地将StringEx对象更改为String

var result:String = "" + new StringEx("aaccaaca").replaceAll('b', 'c').replaceAll('c', 'a');

您可以在这里获得完整版本:

我想不出一个方法来满足您发布的4个要求。但我认为,如果您的主要目标是一次性替换各种令牌,那么您可以尝试以下方法:

public class StringUtil {
    public static function replaceAll(source:String,map:Object):String {
        for(var replaceToken:String in map) {
            source = source.split(replaceToken).join(map[replaceToken]);
        }
        return source;
    }
}

var str:String = "a1ccca111a";

str = StringUtil.replaceAll(str,{
    'a' : 'b',
    '1' : '2'
});
trace(str);
<
p> 有一个警告要记住。对于对象对象,不能保证顺序。在大多数情况下,这并不重要,但如果在您的情况下是这样,您可以使用数组,并在每个插槽中存储令牌及其替换项作为对象。

我想不出一种方法来满足您发布的4个要求。但我认为,如果您的主要目标是一次性替换各种令牌,那么您可以尝试以下方法:

public class StringUtil {
    public static function replaceAll(source:String,map:Object):String {
        for(var replaceToken:String in map) {
            source = source.split(replaceToken).join(map[replaceToken]);
        }
        return source;
    }
}

var str:String = "a1ccca111a";

str = StringUtil.replaceAll(str,{
    'a' : 'b',
    '1' : '2'
});
trace(str);

有一个警告要记住。对于对象对象,不能保证顺序。在大多数情况下,这并不重要,但如果在您的情况下是这样,您可以使用数组,并在每个插槽中存储令牌及其替换项作为对象。

我认为您已经得到了所有可能的技术答案。我将以我认为最好的方式来阐述这门语言

在诸如AS3这样的OOP语言中,不推荐使用原型,主要是因为它们不利于封装。你暗示你不想让其他人对split.join感到困惑;AS3中的原型非常混乱。 作为一个例子,原型声明可以在代码中的任何地方进行,因此它应该驻留在哪里并不明显。如果其他人在您的代码中遇到foo.replaceAll,那么在哪里可以找到该方法并检查它的实际功能一点也不明显

静态函数修正了这一点,非常简单。当然,你需要一个额外的参数,你不能真正正确地链接,但这是一件坏事吗

如果您需要性能,split.join是一个不错的选择。我敢打赌,比起原型的使用,更多的AS3开发人员知道split.join

另一方面,我认为最具语义和实用性的方法是使用自己的语言方法,这就是我之前的答案。您试图用AS3中的另一个字符串替换字符串中的所有指针,为此,该语言使用带有全局标志的string::replace方法。我很确定有一种方法可以轻松解析和使用regexp中的任何字符串


我同意在某些情况下,像replaceAll这样的助手方法可能是必要的,但我强烈建议您不要使用原型,而是使用更标准的方法,比如StringUtil.replace。

我认为您已经得到了所有可能的技术答案。我将以我认为最好的方式来阐述这门语言

在诸如AS3这样的OOP语言中,不推荐使用原型,主要是因为它们不利于封装。你暗示你不想让其他人对split.join感到困惑;AS3中的原型非常混乱。 作为一个例子,原型声明可以在代码中的任何地方进行,因此它应该驻留在哪里并不明显。如果其他人在您的代码中遇到foo.replaceAll,那么在哪里可以找到该方法并检查它的实际功能一点也不明显

静态函数修正了这一点,非常简单。当然,你需要一个额外的参数,你不能真正正确地链接,但这是一件坏事吗

如果您需要性能,split.join是一个不错的选择。我敢打赌,比起原型的使用,更多的AS3开发人员知道split.join

另一方面,我认为最具语义和实用性的方法是使用自己的语言方法,这就是我之前的答案。您试图用AS3中的另一个字符串替换字符串中的所有指针,为此,该语言使用带有全局标志的string::replace方法。我很确定有一种方法可以轻松解析和使用regexp中的任何字符串


我同意在某些情况下,像replaceAll这样的助手方法可能是必要的,但我强烈建议您不要使用原型,而是使用更标准的方法,比如StringUtil.replace。

我知道这是一个旧线程,但这就是我提出的可以处理任何常规字符串的方法

    public static function replaceAll(p_string:String, p_search:String, p_replaceWith:String):String{

    //Dummy Control
        if(p_string == null)
            return '';

    //Iterates through the string from right to left so we don't go over what we are changing.
        var index:int = p_string.lastIndexOf(p_search);
        while(index != -1){

        //Splits the string at the index
            p_string = p_string.slice(0, index) + p_replaceWith + p_string.slice(index+p_search.length);

        //Attempts to find the next index
            index = p_string.lastIndexOf(p_search, index-1);//We -1 so we always move down the line
        }

    //Returns the modified p_string
        return p_string;
    }

我知道这是一个旧线程,但这是我想出的,可以做任何常规字符串

    public static function replaceAll(p_string:String, p_search:String, p_replaceWith:String):String{

    //Dummy Control
        if(p_string == null)
            return '';

    //Iterates through the string from right to left so we don't go over what we are changing.
        var index:int = p_string.lastIndexOf(p_search);
        while(index != -1){

        //Splits the string at the index
            p_string = p_string.slice(0, index) + p_replaceWith + p_string.slice(index+p_search.length);

        //Attempts to find the next index
            index = p_string.lastIndexOf(p_search, index-1);//We -1 so we always move down the line
        }

    //Returns the modified p_string
        return p_string;
    }

这就是他不想用的东西:我不想要:3。Chain split and joinbtw静态函数比混用原型更好-你能详细说明一下吗?@splash我不想要split+join,因为组合的作用不明显。这对我来说是显而易见的,因为我知道StringUtil.replace是如何实现的,但对于其他将阅读我的代码的人来说可能不是。这就是他不想使用的:我不想要:3。Chain split and joinbtw静态函数比混用原型更好-你能详细说明一下吗?@splash我不想要split+join,因为组合的作用不明显。这对我来说很明显,因为我知道StringUtil.replace是如何实现的,但对于其他一些将阅读我的代码的人来说可能不是。你可能不明白我使用a、b和c只是为了说明我想要的东西。我做的

我觉得没必要说。我希望能够用任意字符串替换任意字符串。我编辑了这个问题。另外,由于特殊的正则表达式符号,您不能在正则表达式中转换找到它的字符串。你的答案是迄今为止最糟糕的,你甚至没有尝试过。我不明白为什么有人会投票…你对我的品味有点太高人一等了。。。你是对的,这并不是任何字符串都可以直截了当的,但我相信你可以解决这个问题,我会使用split.join顺便说一句……你可能不明白我使用a、b和c只是为了说明我想要什么。我认为没有必要说出来。我希望能够用任意字符串替换任意字符串。我编辑了这个问题。另外,由于特殊的正则表达式符号,您不能在正则表达式中转换找到它的字符串。你的答案是迄今为止最糟糕的,你甚至没有尝试过。我不明白为什么有人会投票…你对我的品味有点太高人一等了。。。虽然你是对的,这对任何字符串来说都不是那么简单,但我相信你能解决这个问题,我会使用split.join顺便说一句…我说了什么严格的类型检查?我不想那样。我知道怎么做,但我希望它在我代码的其余部分处于活动状态。哦,对不起!我犯了一个错误。但是compiler.es必须使用compiler.strict false设置:@Alin Purcaru。考虑到你要求其他人帮助你解决一个问题,而他们试图帮助你却没有从你那里得到任何回报,我认为你有点太过咄咄逼人了。@Juan我知道,我为此道歉,但这是性格问题,不是编程问题。我认为还没有解决此问题的堆栈交换站点:。我想当我看到答案完全符合我特别说的我不想要的时候,我会感到沮丧。至于问题部分,在我发布问题之前,我使用了[]访问权限。所以你不能真的说我需要快速解决一个问题,而是我想听听解决这个问题的其他程序员的意见。@Alin。好吧,我只是想说,即使你觉得给出的答案不令人满意,对人友善也没有坏处。无论如何,我发布了一个可能的选项。关于严格的类型检查,我说了些什么?我不想那样。我知道怎么做,但我希望它在我代码的其余部分处于活动状态。哦,对不起!我犯了一个错误。但是compiler.es必须使用compiler.strict false设置:@Alin Purcaru。考虑到你要求其他人帮助你解决一个问题,而他们试图帮助你却没有从你那里得到任何回报,我认为你有点太过咄咄逼人了。@Juan我知道,我为此道歉,但这是性格问题,不是编程问题。我认为还没有解决此问题的堆栈交换站点:。我想当我看到答案完全符合我特别说的我不想要的时候,我会感到沮丧。至于问题部分,在我发布问题之前,我使用了[]访问权限。所以你不能真的说我需要快速解决一个问题,而是我想听听解决这个问题的其他程序员的意见。@Alin。好吧,我只是想说,即使你觉得给出的答案不令人满意,对人友善也没有坏处。无论如何,我正在发布一个可能的选项。这可能是一个备选方案,因为您只需要包装一次,但我希望有一个原型解决方案,或者至少和答案证明我想要的不能或不应该实现。这可能是一个备选方案,因为您只需要包装一次,但我希望有一个原型解决方案,或者至少我的回答证明了我想要的东西不能或不应该实现。有趣的方法。我想不出一个方法来满足你发布的4个要求。你这么说是因为你真的想不出办法,还是你真的认为向字符串对象添加replaceAll是不可能的?@Alin。我的意思是我自己找不到办法。也许没有,但也许有人找到了,谁知道呢。如果你走原型路线,你就会失去你所知道的类型检查。对于使用此方法的所有代码;也许有一种方法可以在代码的其余部分避免这种情况,但如果可能的话,这肯定会涉及到。cont扩展字符串是不可能的,因为类是final的,所以使用对象实例进行方法链接需要额外的锅炉板,您可以使用某种包装器,但如果需要字符串,就不能使用它;这就是我认为你能得到大部分锅炉板的地方。因此,我认为在特定的环境下,实用静态方法是最简单、直接和直观的选择。有趣的方法。我想不出一个方法来满足你发布的4个要求。你这么说是因为你真的想不出办法,还是你真的认为向字符串对象添加replaceAll是不可能的?@Alin。我的意思是我自己找不到办法。
也许没有,但也许有人找到了,谁知道呢。如果你走原型路线,你就会失去你所知道的类型检查。对于使用此方法的所有代码;也许有一种方法可以在代码的其余部分避免这种情况,但如果可能的话,这肯定会涉及到。cont扩展字符串是不可能的,因为类是final的,所以使用对象实例进行方法链接需要额外的锅炉板,您可以使用某种包装器,但如果需要字符串,就不能使用它;这就是我认为你能得到大部分锅炉板的地方。因此,我认为在这种情况下,使用效用静态方法是最简单、直接和直观的选择。如果否决投票的人能够证明他们的行为是正确的,这样我就能改进这个问题。谢谢你,wtf?你不想用正则表达式?那么,进行字符串搜索/替换还有什么意义呢?您正在替换字符串。使用字符串函数。在正则表达式中使用变量并不难………@Daniel您可能不理解这个问题。或者读得不够专心。我想做的是使用StringUtil.replace的功能,但直接作为String对象上的方法。我没有一个模式,我只是有一个字符串,我想更换。有很多方法可以做到这一点,但我想要一些干净的东西,比如字符串上的方法,或者尽可能干净,就像9re或Juan Pablo Califano建议的那样。@Daniel,你也没有连贯性。我不是说你的英语很糟糕,这很奇怪,因为你的个人资料说你来自纽约,而是说你自相矛盾。例如:您不想使用正则表达式?你正在替换一个字符串。使用字符串函数..你似乎回答了你自己的问题。您声明要替换,但不想使用正则表达式、连接、拆分、StringUtil.replace或类型检查。世界跆拳道联盟。StringUtil.prototype.replaceAll=函数r:String,w:String:String{返回this.replacenew RegExpr,'g',w;如果否决投票的人能够证明他们的行为是正确的,那就太好了,以便我能够改进这个问题。谢谢你。wtf?你不想使用regex?那么,甚至进行字符串搜索/替换还有什么意义?你正在替换字符串。使用字符串函数。使用起来并不难正则表达式中的一个变量………@Daniel您可能不理解这个问题。或者没有足够的注意力阅读它。我想做的是StringUtil.replace的功能,但直接作为String对象上的一个方法。我没有模式,我只想替换一个字符串。有很多方法可以做到这一点,但我想做点什么ng像字符串上的方法一样干净,或者像9re或Juan Pablo Califano建议的那样尽可能干净。@Daniel你也不连贯。我不是说你的英语很差,这很奇怪,因为你的个人资料说你来自纽约,而是说你在自相矛盾。例如:你不想使用regex?vs、 您正在替换字符串。请使用字符串函数..您似乎回答了自己的问题。您声明要替换,但不想使用正则表达式、连接、拆分、StringUtil.replace或类型检查。wtf.StringUtil.prototype.replaceAll=函数r:string,w:string:string{return this.replacenew RegExpr,'g',w;您不使用原型可能是对的,对此我接受答案。至于将字符串转换为与这些字符串完全匹配的regex等价物,这样做意味着在每个replace令牌上调用一个静态函数,我认为这将等同于他发布的其他解决方案关于这个问题,我想知道的是,你是否可以,也可以,向现有的对象类型添加功能。答案似乎是:不,谢谢你的贡献!你不使用原型可能是对的,我会接受这个答案。至于将字符串转换成与这些字符串完全匹配的正则表达式等价物字符串,这样做意味着在每个替换令牌上调用一个静态函数,我认为这与这里发布的其他解决方案是等效的。我想通过这个问题了解的是,您是否可以并且可以向现有对象类型添加功能。答案似乎是:不可以。感谢您的贡献!