有没有办法在C#中一个接一个地替换?

时间:2017-03-12 06:52:22

标签: c#

我正在尝试复制看起来像这样的javascript代码:

car = document.transcription.text1.value;
car = car.replace(/ん/g, "n");
car = car.replace(/つ/g, "tsu");
car = car.replace(/きゃ/g, "kya");
car = car.replace(/きゅ/g, "kyu");
car = car.replace(/きょ/g, "kyo");
...

至少有50个替换。

我有没有办法在C#中通过链接一个又一个的替换来复制这个功能?

4 个答案:

答案 0 :(得分:2)

至少你需要告诉编译器应该用什么代替?

声明字典并将其提及为

Dictionary<string, string> replaces = new Dictionary<string, string>() 
{ 
    {"old1", "new1"},
    {"old2", "new2"},
    {"old3", "new3"}
};

然后在循环中,你可以这样做

foreach (var item in replaces)
{
    str.Replace(item.Key, item.Value);
}

答案 1 :(得分:1)

Replace会返回string,因此请继续对返回的值调用Replace,如下所示:

var name = "How are you there buddy?";
name =
   name
      .Replace('H', '_')
      .Replace('o', '_')
      .Replace('w', '_');

另一种方法

注意:我认为第一种方法更简单,更直观:无论是使用字典还是只使用简单的Replace,您仍然需要键入替换和替换的字符串。你决定了。

如果您想要保留所有要替换的项目以及字典中的替换项目,那么您也可以使用Linq的Zip方法。不要让这个名字让你失望,因为它与压缩文件没有任何关系。它的名字实际上取决于衣服上的拉链是如何工作的。衣服上的拉链列举拉链的两侧,或者闭合牙齿或者一个接一个地打开牙齿。这正是Zip所做的。你给它两个IEnumerable<T>,它将枚举它们并在每次枚举期间执行操作。方法如下:

var name = "How are you there buddy?";
var replacer = new Dictionary<string, string>();
replacer.Add("H", "_");
replacer.Add("o", "-");
replacer.Add("e", "*");

var names = replacer.Zip(name, (x, y) => name = name.Replace(x.Key, x.Value))
   .Last(); 

这将是我们所期望的输出:

_-w ar* y-u th*r* buddy?

答案 2 :(得分:0)

作为一个简单的答案,

car = car.replace(/ん/g, "n").replace(/つ/g, "tsu").replace(/きゃ/g, "kya").replace(/きゅ/g, "kyu").replace(/きょ/g, "kyo")...;

虽然有50多个替换,但您可能只想制作字典或数组或其他内容并循环播放。

答案 3 :(得分:0)

是的,您可以使用以下扩展方法(如果您需要使用正则表达式,例如转换为相同字母序列的相同表达式):

public static class RegexStringExtension
{
    public static String RegexReplace ( this String haystack, String regex, String replacement )
    {
        return new Regex ( regex ).Replace ( haystack, replacement );
    }
}

然后你可以像这样连接它们(或者只使用正常的替换,如果它们都是唯一的):

var car = // ... get the value somehow
car = car.RegexReplace ( "ん", "n" )
    .RegexReplace ( "つ", "tsu" )
    .RegexReplace ( "きゃ", "kya" )
    .RegexReplace ( "きゅ", "kyu" )
    .RegexReplace ( "きょ", "kyo" );
    // ... other replacements

我测试了代码,它似乎有效:https://ideone.com/Yu7pUE