C# - 如何替换带重音的字符,例如 "-É" 替换为 "- É"

4
我正在使用Visual Studio和C#制作一个非常简单的Windows应用程序,用于编辑电影字幕文件。我想要一个程序,当对话句子中没有空格时,可以添加一个空格。例如:
- 嗨,最近怎么样?
- 没什么。
变成
- 嗨,最近怎么样?
- 没什么。
我使用工具箱创建了一个仅包含一个按钮以选择正确文件的接口。这是我为此按钮编写的代码:
private void button1_Click(object sender, EventArgs e)
    {
        if (openFileDialog1.ShowDialog() == DialogResult.OK)
        {
            string text = File.ReadAllText(openFileDialog1.FileName, Encoding.GetEncoding("iso-8859-1"));
            text = text.Replace("-A", "- A");
            File.WriteAllText(openFileDialog1.FileName, text, Encoding.GetEncoding("iso-8859-1"));
        }
    }

这个操作基本上是将“-A”替换为“- A”,从而创建一个空格。这是我想出的解决方案,我打算对每个字母都这样做,包括带重音符号的字母,如À、Á、È、É等。
但是这并不起作用。如果我输入text = text.Replace("-É", "- É");,程序什么也不做。
我想知道如何修复这个问题。
感谢您阅读,如果您有更好的应用程序替代方案,请随时让我知道。

你需要研究正则表达式。你不必为每个可能的字母手动执行此操作! - Blorgbeard
使用 regex.Replace() - Harsh
谢谢大家。@Rob,能否解释一下你为什么使用了 Regex("^-")?我尝试了你的代码行,但很遗憾它没有起作用。 - Telmo F.
@Rob 那个方法也不行。它对我想要修改的文件没有任何作用。所有的破折号仍然没有空格。 - Telmo F.
1
@Rob,这真的很奇怪。但是我实际上已经成功地使用了A.Chiesa编辑后的解决方案,所以你不必再麻烦了。非常感谢你抽出宝贵时间尝试帮助我!我一定会把你的解决方案保存好,以备将来参考。 - Telmo F.
显示剩余5条评论
2个回答

6
关于评论,请使用正则表达式(Regex)。
        var rx = new System.Text.RegularExpressions.Regex("^-([^ ])");
        ... in your loop
        var text = rx.Replace(text, "- $1");

基本上,它会在字符串开头搜索破折号,但仅限于后面没有空格的情况。()表示应该“保存”破折号后面的字符。replace在提供的字符串中搜索并用破折号、空格和相同的字符替换(匹配前面的字符)。无论是什么字符。
来源:https://xkcd.com/208/ 编辑:您没有循环,而是一个包含文件完整内容的字符串,在其中每行都应该包含字幕行(对吗?)。 如果是这种情况,您可以将正则表达式配置为将字符串视为一系列行,如下所示:
        var rx = new Regex("^-([^ ])", RegexOptions.Multiline);

查看此示例,请访问以下链接: https://dotnetfiddle.net/ciFlAu

非常感谢。我有几个问题:1- System.Text.RegularExpressions.Regex 显示为灰色,当我将鼠标悬停在其上时,它会显示“名称可以简化”。这很重要吗?2- 我不明白你所说的“...在你的循环中”。我很新,昨天才开始学习C#。您的代码在我的应用程序上无法正常工作,它根本没有更改字幕文件。您有任何想法为什么会这样吗? - Telmo F.
1 - 如果您的文件中已经使用了System.Text.RegularExpressions,那么您不需要使用完全限定名称。因此,您可以放心地简化它。 2 - 我现在意识到您的代码中没有循环。您必须为正则表达式提供一些选项。让我查一下。 - Alberto Chiesa
你的修改完美地解决了问题。非常感谢!我本来要写几十行代码,每一行都是为了处理可能出现的每一个字母,而你只用了一行就解决了问题。这才是高效率!再次感谢你。 - Telmo F.

1

对于带重音符号的字符,考虑使用其Unicode表示:

string text = "-\u00C9"; //-É
text = text.Replace("-\u00C9", "- \u00C9"));

如果需要替换空格,您也可以使用不间断空格:

string text = "-\u00C9";
text = text.Replace("-\u00C9", "-\u00A0\u00C9"));

然后您可以使用UTF-8 / UTF-16进行编码:
File.WriteAllText(openFileDialog1.FileName, text, Encoding.GetEncoding("UTF-8"));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接