RegExp:X匹配数量=> X个替换件?

时间:2013-05-10 07:32:59

标签: c# regex actionscript-3

使用正则表达式我尝试匹配一个字符串,该字符串具有由未知重复次数(一个或多个)组成的子字符串,然后用相同数量的替换字符串替换重复的子字符串。

如果Regexp是"(st)[a]+(ck)",那么我想得到这样的结果:

"stack" => "stOck"
"staaack" => "stOOOck" //so three times "a" to be replaced with three times "O"
"staaaaack" => "stOOOOOck"

我该怎么做?

C#或AS3都可以。

5 个答案:

答案 0 :(得分:1)

如果您使用.net,则可以执行此操作

find:    (?<=\bsta*)a(?=a*ck\b)
replace: o

如果您想要更改其他单词子串的所有sta + ck,只需删除\b

答案 1 :(得分:1)

由于我不熟悉C#或AS3,我将用JavaScript编写解决方案,但解决方案中的概念可用于C#代码或AS3代码。

var str = "stack stackoverflow staaaaaack stOackoverflow should not replace";
var replaced = str.replace(/st(a+)ck/g, function ($0, $1) {
    var r = "";
    for (var i = 0; i < $1.length; i++) {
        r += "O";
    }
    return "st" + r + "ck";
});

输出:

"stOck stOckoverflow stOOOOOOck stOackoverflow should not replace"

在C#中,您可以使用Regex.Replace(String, String, MatchEvaluator)(或其他Regex.Replace方法接受MatchEvaluator委托)来达到同样的效果。

在AS3中,您可以将函数作为替换函数传递,类似于我在JavaScript中的操作。查看String.replace()方法的文档。

答案 2 :(得分:0)

为什么不使用String Replace()方法?

var str = "stack";
str = str.Replace("a", "O");

答案 3 :(得分:0)

我会这样做:

       String s = "Staaack";

        Console.WriteLine(s);

        while (Regex.Match(s,"St[O]*([a]{1})[a]*ck").Success){
            s = Regex.Replace(s,"(St[O]*)([a]{1})([a]*ck)", "$1O$3");
            Console.WriteLine(s);
        }

        Console.WriteLine(s);


        Console.ReadLine(); 

它会在每次迭代时替换一个a,直到找不到为止。

答案 4 :(得分:0)

对于AS3,您可以将function传递给replace对象上的String方法,其中匹配元素位于arguments数组中。因此,您可以构建并返回一个新的String,其中所有'a'都替换为'O'

例如:

        // first way explicit loop
        var s:String="staaaack";
        trace("before", s);
        var newStr:String = s.replace(/(st)(a+)(ck)/g, function():String{
          var ret:String=arguments[1]; // here match 'st'
          //arguments[2] match 'aaa..'
          for (var i:int=0, len:int=arguments[2].length; i < len; i++)
             ret += "O";
          return ret + arguments[3]; // arguments[3] match 'ck'
        });
        trace("after", newStr); // output stOOOOck

        // second way array and join
        var s1:String="staaaack staaaaaaaaaaaaack stack paaaack"
        trace("before", s1)
        var after:String = s1.replace(/(st)(a+)(ck)/g, function():String{
            return arguments[1]+(new Array(arguments[2].length+1)).join("O")+arguments[3]
        })
        trace("after", after)

这里有关于wonderfl的实例:http://wonderfl.net/c/bOwE