0

正規表現を使用して、不明な数の繰り返し (1 つ以上) で構成される部分文字列を持つ文字列を照合し、繰り返し部分文字列を同じ数の置換文字列に置き換えようとしています。

正規表現が の場合、"(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

他の単語の部分文字列であるすべての st+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

代わりにString Replace()メソッドを使用しないのはなぜですか?

var str = "stack";
str = str.Replace("a", "O");
于 2013-05-10T07:39:36.797 に答える
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 が見つからなくなるまで、すべての反復で 1 つの a を置き換えます。

于 2013-05-10T07:47:20.500 に答える
0

AS3 の場合、一致する要素が配列にあるオブジェクトのreplaceメソッドにafunctionを渡すことができます。したがって、すべての「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 に答える