用印刷字母替换直引号:“我的文字”改为“我的文字”

时间:2015-04-08 00:05:45

标签: c# .net string

我想改变"我的文字"到处都是“我的文字”,因为这是用德语写的正确方法。引号可以在文本中的任何位置。

有没有简单的方法来实现这一目标?

解决方案应该检查第一个字符,最后一个字符,例如"这个",或者(检查"这个")......

我目前的做法是:

public static string FixGermanQuotationMarks(string input)
{
    string output = input;
    if (output[0] == '"') output = "„" + output.Substring(1, output.Length - 1);

    if (output.EndsWith("\"")) output = output.Substring(0, output.Length-1) + '“';

    output = output
        .Replace(" \"", " „")
        .Replace("(\"", "(„")
        .Replace("<\"", "<„")

        .Replace("\".", "“.")
        .Replace("\")", "“)")
        .Replace("\"<", "“<")
        .Replace("\" ", "“ ");

    return output;
}

但这根本不优雅。

编辑:

我被问到输入和输出的示例。你走了:

  

&#34; Chili Pasilla&#34; ist mein Lieblings-Chili。 Wenn man es richtig sauber   entkernt ist es auch gar nicht scharf。 Das scharfe an der Chili sind   死于Kerne und die&#34; Venen&#34;。

应该成为:

  

“Chili Pasilla”ist mein Lieblings-Chili。 Wenn man es richtig sauber   entkernt ist es auch gar nicht scharf。 Das scharfe an der Chili sind   死于Kerne und die“Venen”。

2 个答案:

答案 0 :(得分:4)

我不知道这是不是您正在寻找的,但这是我将采用的正则表达式解决方案:

    public static string FixGermanQuotationMarks(string input)
    {
        var pattern = @"""([^""]*)""";
        return Regex.Replace(input, pattern, @"„$1“");
    }

这可能会让必须转义的引号混淆,所以试想一下,如果它不是用于转义引号,实际模式看起来会更像这样:"([^"]*)"。好吧,让我们打破这个:

  • "这符合您的开头“常规”报价

  • (这是捕获引号所包含的内容。如果您不知道这意味着什么,您将在一分钟内看到

  • [^"]这匹配不是引用的所有内容(字母,数字,空格等)^是创建正则表达式时的否定运算符,因此^"表示{ {1}} *everything but*

  • "这意味着您可以拥有前一个项目的零个或多个,在我们的示例中,它是除引号字符之外的任何字符。这是为了确保您捕获引号之间的字母数。

  • *我们关闭了我们的捕获组

  • )这与结束语

  • 相符

现在,捕捉组的意思是什么?它只是意味着,在匹配的情况下,我们实际上可以在替换原始文本中的匹配内容时重用部分匹配。在我们的例子中,我们感兴趣的是两个引号之间的内容,这就是我们捕获它的原因。我们可以使用"来引用我们捕获的内容,$1指的是第一个(在我们的例子中是唯一的)捕获组。然后,我们将这个捕获的文本放在德语引号之间,并使用结果字符串替换整个匹配。正如我之前提到的,在查看我发布的代码以查看这么多引号时可能会让人感到困惑,但是必须使用它们对字符串文字进行转义。

在此之后,你只需要像这样调用方法:

var input = @"""Chili Pasilla"" ist mein Lieblings-Chili.";
var germanified = FixGermanQuotationMarks(input);

希望这能澄清正则表达式方法。

答案 1 :(得分:3)

您可以在字符串类上编写扩展方法来执行此操作:

编辑根据良好的反馈,在扩展方法中使用了StringBuilder以获得更好的效果。

public static class StringExtensions
{
    /// <summary>
    /// Replaces every odd straight quote with '„' and every even straight quote with '“'.
    /// </summary>
    /// <param name="source">The string acting as the source for replacements.</param>
    /// <returns>A string with replacements made.</returns>
    public static string ReplaceStraightQuotes(this string source)
    {
        if (source == null) return null;

        var result = new StringBuilder(source);

        var lastIndex = source.IndexOf('"');
        int count = 0;

        while (lastIndex > -1)
        {
            char replaceQuote = (count++ % 2 == 0) ? '„' : '“';
            result.Replace('"', replaceQuote, lastIndex, 1);
            lastIndex = source.IndexOf('"', lastIndex + 1);
        }

        return result.ToString();
    }
}

然后你就可以使用它:

var result = "He said, \"Hello, you look lovely.\"";
Console.WriteLine(result);
Console.WriteLine(result.ReplaceStraightQuotes());

输出:

  

结果=&#34;他说,\&#34;你好,你看起来很可爱。\&#34;&#34;

     

result.ReplaceStraightQuotes()=   &#34;他说,“你好,你看起来很可爱。”&#34;