0

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

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

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

我怎么做?

C# 或 AS3 都可以。

4

5 回答 5

1

如果您使用.net,您可以这样做

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

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

于 2013-05-10T07:47:49.677 回答
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()方法的文档。

于 2013-05-10T08:17:01.043 回答
0

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

例如:

        // 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

于 2013-05-10T11:17:55.860 回答
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 ,直到找不到更多 a 为止。

于 2013-05-10T07:47:20.500 回答
0

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

var str = "stack";
str = str.Replace("a", "O");
于 2013-05-10T07:39:36.797 回答