我想改变"我的文字"到处都是“我的文字”,因为这是用德语写的正确方法。引号可以在文本中的任何位置。
有没有简单的方法来实现这一目标?
解决方案应该检查第一个字符,最后一个字符,例如"这个",或者(检查"这个")......
我目前的做法是:
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”。
答案 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;