C#准确替换字符串/子字符串
目前我有大量的拼音符号条目(在数组中),一些字符串是组合的,例如C#准确替换字符串/子字符串,c#,.net,C#,.net,目前我有大量的拼音符号条目(在数组中),一些字符串是组合的,例如Diánnǎo=Dián+nǎo 现在的问题是我想替换一个包含2个或更多的字符串,例如: string[] Py = { "xi", "xia", "xian" }; string[] Km = { "shi", "shie, "shien" }; string[] Input = "xiaguo"; for (int i = 0; i < Py.Length; i++) if (Input.Contains(Py[i
Diánnǎo
=Dián
+nǎo
现在的问题是我想替换一个包含2个或更多的字符串,例如:
string[] Py = { "xi", "xia", "xian" };
string[] Km = { "shi", "shie, "shien" };
string[] Input = "xiaguo";
for (int i = 0; i < Py.Length; i++)
if (Input.Contains(Py[i]))
Input = Input.Replace(Py[i], Km[i]);
string[]Py={“xi”、“xia”、“xian”};
字符串[]Km={“shi”,“shie”,“shien”};
字符串[]输入=“下过”;
对于(int i=0;i
上面的代码由于循环索引而出现问题,xiaguo
包含xi
变为真(shiaguo)
不是(shieguo)
因为xi
先于xia
如何实现这一点?并确保获得xia
而不是xi
我在GitHub上发布的完整代码:您可以为此使用常规表达式。 我修改了你的代码,所以正则表达式WIL只匹配席而不是夏。 正则表达式“席”与“席”匹配,B表示单词边界,所以只与那个词匹配。
string[] Py = { "xi", "xia", "xian" };
string[] Km = { "shi", "shie, "shien" };
string[] Input = "xiaguo";
string pattern = "xi\b"
Regex rgx = new Regex(pattern, RegexOptions.IgnoreCase);
for (int i = 0; i < Py.Length; i++)
{
MatchCollection matches = rgx.Matches(Py[i]);
if (matches.Count > 0)
{
Input = Input.Replace(Py[i], Km[i]);
}
}
string[]Py={“xi”、“xia”、“xian”};
字符串[]Km={“shi”,“shie”,“shien”};
字符串[]输入=“下过”;
字符串模式=“xi\b”
Regex rgx=新的Regex(模式,RegexOptions.IgnoreCase);
对于(int i=0;i0)
{
输入=输入。替换(Py[i],Km[i]);
}
}
音调/语言细节的结构不容易,因此您可能会假设一些模式,然后发现它不适合某些“单词”。
无论如何,要处理已知场景,您必须按长度降序排列目标音调,然后对每个“单词”只执行一次替换(这将避免在处理时替换xi,xia)
这些步骤将是:
这里的想法与替换列表中的两个数字时的想法相同,例如,2对1和3对2。顺序确实很重要,如果用2替换3,那么最终将同时替换3和2对1。假设较长的标记优先于较短的标记,那么这两个数组可以转换为字典,然后按len排序钥匙的gth:
var dic = new Dictionary<string, string>
{
{"xi","shi"},
{"xia","shie"},
{"xian","shien"},
}.OrderByDescending(x => x.Key.Length)
.ThenBy(x => x.Key)
.ToDictionary(x => x.Key, x => x.Value);
string input = "xiaguo";
foreach(var d in dic)
input = input.Replace(d.Key, d.Value);
Console.WriteLine(input);
var dic=新字典
{
{“xi”,“shi”},
{“夏”、“什”},
{“xian”,“shien”},
}.OrderByDescending(x=>x.Key.Length)
.ThenBy(x=>x.Key)
.ToDictionary(x=>x.Key,x=>x.Value);
字符串输入=“下过”;
foreach(dic中的变量d)
输入=输入.替换(d.键,d.值);
控制台写入线(输入);
上面的示例使用字典排序:
- 按钥匙的长度
- 然后按字母键排序
- 最后,LINQ查询被转换回字典
从这里开始,只需迭代字典并替换所有标记;无需检查键/标记是否存在。根据字符长度降序排序数组,然后应用逻辑。也可以使用
字典,而不是基于相同索引的两个数组。旁注:不需要检查Contains
在调用replace之前,如果它不包含给定的字符串,结果字符串将保持不变。Habib,我将数组转换为字典,现在我丢失了…您的方法工作正常,我将使用TryGetValue
方法避免第二次替换和精确。但是dict中不包含的单词将被跳过,如何显示不相关?