我正在尝试复制看起来像这样的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#中通过链接一个又一个的替换来复制这个功能?
答案 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