2015-04-08 5 views
1

Я хочу изменить «Мой текст» на «Мой текст» везде автоматически, потому что это правильный способ, это написано на немецком языке. Кавычки могут быть в любом месте текста.Заменить прямые кавычки на типографские: «Мой текст» на «Мой текст»

Есть ли простой способ достичь этого?

Раствор должен проверить самый первый символ, самое последнее, что-то вроде «это», или (проверить «это») ...

Мой текущий подход:

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; 
} 

но это совсем не изящно.

EDIT:

меня попросили, например, вход и выход. Здесь вы найдете:

"Chili Pasilla" ist mein Lieblings-Chili. Wenn man es richtig sauber entkernt ist es auch gar nicht scharf. Das scharfe an der Chili sind die Kerne und die "Venen".

должны стать:

«Chili Пасилья» ист майн Lieblings-Chili. Wenn man es richtig sauber entkernt ist es auch gar nicht scharf. Das scharfe an der Chili sind die Kerne und die "Venen".

+0

Я не очень уверен в регулярных выражениях, но я надеюсь, что есть способ решить проблему с ними. – Tillito

+0

Вы что-то пробовали? Если да, можете ли вы поделиться им с нами? – Ben

+2

Что вы подразумеваете под «везде автоматически»? В текстовом файле? В приложении у вас нет источника? В каждом тексте, когда-либо написанном где угодно, включая бляшки на Луне? –

ответ

4

Я не знаю, если это именно то, что вы ищете, но вот регулярное выражение решение, которое я использовал бы:

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

Это может привести к путанице с цитаты того, чтобы быть экранированы, так что просто представить себе, что фактический шаблон выглядел бы более похоже на это, если бы не ускользание котировок: "([^"]*)".Хорошо, давайте разберем это вниз:

  • " Это соответствует вашему открытию «регулярный» цитата

  • ( Это захватить содержание, которое окружено кавычками. Если вы не знаете, что это значит, вы будете видеть через минуту

  • [^"] Это соответствует все, что не цитата (буквы, цифры, пробелы и т.д.) ^ оператор отрицанием при создании регулярных выражений, так ^" означает *everything but*"

  • * Это означает, что вы можете иметь ноль или больше предыдущего пункта, который, в нашем случае, был любой символ, но кавычки. Это делается для того, чтобы вы зафиксировали столько букв, сколько существует между кавычками.

  • ) Мы закрываем наш захват группа

  • " Это соответствует закрывающей кавычке

Теперь, что я имею в виду группы захвата? Это просто означает, что в случае соответствия мы можем фактически повторно использовать часть матча, когда придет время заменить содержание матча в исходном тексте. В нашем случае все, что нас интересует, - это контент, который находится между двумя кавычками, поэтому мы его захватили. Мы можем ссылаться на то, что мы захватили, используя $1, который относится к первой (и в нашем случае единственной) группе захвата. Затем мы просто помещаем этот захваченный текст между немецкими кавычками и используем результирующую строку для замены всего совпадения. Как я упоминал ранее, это может сбивать с толку при просмотре кода, который я опубликовал, чтобы увидеть так много цитат, но строковый литерал должен быть экранирован с их использованием.

После этого вам нужно всего лишь вызвать метод следующим образом:

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

Надеется, что это проясняет метод регулярных выражений.

+0

Очень приятно! Он не форматирует бродячую цитату, если она есть в конце, но это не было определено как требование. И это также можно было бы легко добавить в качестве метода расширения, если это необходимо. –

+0

На самом деле, цитата изгоев может иметь некоторые катастрофические результаты, в зависимости от ее размещения, и если выходные данные перезаписываются. Если у нас есть что-то вроде: «xxxxxxx» what_i_want_to_capture «xxxx», «x» будет захвачен, но цитируемый контент не будет. В этом случае, если, вероятно, более безопасно проверять, не превышает ли счет кавычек раньше заменяя –

+0

Это именно то, что я искал. Кажется, хорошо работает с моими настоящими данными. Спасибо большое! – Tillito

3

Вы могли бы написать метод расширения класса строки, чтобы сделать это:

EDIT Основываясь на хорошей обратной связью, использовал 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()); 

Выход:

результат = "Он сказал, \" Здравствуйте, вы прекрасно выглядите \ ""

. result.ReplaceStraightQuotes() = «Он сказал:« Привет, ты выглядишь прекрасно ».«

+0

Обратите внимание, что это код, который имеет дело с более длинными строками 'StringBuilder 'было бы лучше (и вы можете просто заменить символы на месте таким образом). –

+0

@AlexeiLevenkov Хорошая обратная связь, спасибо. Включил это в мой ответ. –

Смежные вопросы