目前我有大量的拼音音符表达式(数组中),一些字符串被合并,例如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]);
由于循环索引,上面的代码存在问题,xiaguo
包含xi
变为真(shiaguo)
而非(shieguo)
,因为xi
在xia
之前获得}
我如何实现这一目标?并确保获取xia
而不是xi
我在GitHub上发布的完整代码:https://github.com/Anime4000/py2km/blob/beta/py2km.api/Converter.cs#L15
答案 0 :(得分:0)
你可以使用常规表达式。 我修改了你的代码,所以正则表达式只匹配xi而不是xia。 正则表达式“xi \ b”匹配xi,而\ 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]);
}
}
答案 1 :(得分:0)
语气/语言细节不可能有一个简单的结构,所以你可以假设一些模式,然后发现它不适合某些单词&#39;。 无论如何,为了处理明智的场景,你必须按照下降的长度订购目标音调,然后只对每个单词进行一次替换。 (处理 xian 时,这将避免替换 xi , xia 。
步骤如下:
这里的想法与替换列表中的两个数字相同,例如2比1和3比2。订单真的很重要,如果你用3替换2,那么你将把3和2都替换为1。
答案 2 :(得分:0)
假设较长的令牌优先于较短的令牌,则可以将2个数组转换为字典,然后按键的长度排序:
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);
以上示例对字典进行排序:
从那里,只需遍历字典并替换所有标记;没有必要检查密钥/令牌是否存在。