16568


文字列の部分置換を行いたいと思うのですが  
簡単な方法を教えてください。

例えば

`String data = "かきくけこさしくせそあいくえお";`

最後の"く"を "う" に置換したい。  
次は、"く" を "す" に置換したい。

例では、規則性があるように見えますが、実際の  
データは、置換する文字列の前後は、規則性がありませんので  
正規表現は、使用できません。

以上


CC BY-SA 3.0
2015-09-13T13:07:24.670
16564
2022-02-13T23:11:19.543
2022-02-13T23:11:19.543
4236
7505
question
c# .net 正規表現
文字列の部分置換


> 最後の"く"を "う" に置換したい。  
>  次は、"く" を "す" に置換したい。

を文字通り実現すれば正規表現でも構わないでしょうか？

[code]

    String data = "かきくけこさしくせそあいくえお";
    
    // 最後の"く"を "う" に置換したい。 => 「く」以降は末尾まで全て「く」以外
    data = Regex.Replace(data, "く(?=[^く]+$)", "う");
    
    // 次は、"く" を "す" に置換したい。 => 同上
    data = Regex.Replace(data, "く(?=[^く]+$)", "す");
    
    Console.WriteLine(data);
    // "かきくけこさしすせそあいうえお"
    
[/code]


CC BY-SA 3.0
2015-09-13T13:21:25.670
16565
2015-09-13T13:21:25.670
4236
16564
answer


通常、このような条件だとsayuriさんの例のように正規表現で処理するのが常道かと思います。

が、どうしても、System.Text.RegularExpressions名前空間は親の仇で使えない等の理由があるのであれば、お手軽なメソッドは用意されていないと思われるので、String.LastIndexOf()と.Substring()を使ってちまちま切張りするのがおそらく一番ストレートなアプローチになるでしょう。

[code]

    static void Main(string[] args)
    {
        var source = "かきくけこさしくせそあいくえお";
        var a1 = ReplaceLastMatch(source, "く", "う");
        var a2 = ReplaceLastMatch(a1, "く", "す");
        Console.WriteLine(a2);
    }
    
    private static string ReplaceLastMatch(string str, string target, string alternative)
    {
        var pos = str.LastIndexOf(target);
        if (pos >= 0)
            return str.Substring(0, pos) + alternative + str.Substring(pos + target.Length);
        return str;
    }
    
[/code]


CC BY-SA 3.0
2015-09-13T14:22:35.180
16568
2015-09-13T14:22:35.180
2947
16564
answer