2011-08-24 122 views
17

我喜欢在c#中使用@“字符串”,特别是当我有很多多行文本时。唯一的烦恼是我的代码格式在涂鸦的时候会这样做,因为第二行和更多的行完全推向左侧,而不是使用我精美格式化代码的缩进。我知道这是通过设计,但有没有选择/黑客的方式允许这些行缩进,而不添加实际的制表符/空格到输出?多行格式化c#中的逐字字符串(前缀为@)

加入例如:

 var MyString = @" this is 
a multi-line string 
in c#."; 

我的变量声明缩进“正确”的深度,但该字符串中的第二和进一步线被推到左边与容限,使代码是有点难看。您可以将标签添加到第2行和第3行的开头,但字符串本身将包含这些标签......有道理?

+0

你可以举个例子!? – gideon

+1

我通常所做的就是在自己的行上(即'@'之前的换行符)开始字符串,所以至少它不在右边,然后突然在左边。我知道这不是你想要的解决方案。 –

+0

是的,我也经常这样做。这真的不是什么大事,但我认为这将是一个有趣的问题。 –

回答

9

字符串扩展如何?更新:我重读你的问题,我希望有更好的答案。这也是让我感到困惑的事情,因为下面的解决方案令人沮丧,但它的确有用。

using System.Text.RegularExpressions; 

namespace ConsoleApplication1 
{ 
    public static class StringExtensions 
    { 
     public static string StripLeadingWhitespace(this string s) 
     { 
      Regex r = new Regex(@"^\s+", RegexOptions.Multiline); 
      return r.Replace(s, string.Empty); 
     } 
    } 
} 

和示例控制台程序:

using System; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string x = @"This is a test 
       of the emergency 
       broadcasting system."; 

      Console.WriteLine(x); 

      Console.WriteLine(); 
      Console.WriteLine("---"); 
      Console.WriteLine(); 

      Console.WriteLine(x.StripLeadingWhitespace()); 

      Console.ReadKey(); 
     } 
    } 
} 

和输出:

This is a test 
       of the emergency 
       broadcasting system. 

--- 

This is a test 
of the emergency 
broadcasting system. 

,如果你决定走这条路使用它清洁方法:

string x = @"This is a test 
    of the emergency 
    broadcasting system.".StripLeadingWhitespace(); 
// consider renaming extension to say TrimIndent() or similar if used this way 
+0

是的,这是我正在考虑的解决方案。可能需要添加智能来剥离一定数量的空格或制表符,因为它可能需要在某些行上使用空格/制表符;) –

+0

也许可以检查字符串是否以空格开头并默认替换'^ \ s + “如果有这么多的空白,那么? – Cymen

2

我想不出一个能够完全满足您的问题的答案,但是您可以编写一个函数,从字符串中包含的文本行中去掉前导空格,并在每次创建此类字符串时调用它。

var myString = TrimLeadingSpacesOfLines(@" this is a 
    a multi-line string 
    in c#."); 

是的,这是一个黑客,但你指定你接受黑客在你的问题。

+0

这个问题是 - 我在某些情况下可能需要一些空白空间,所以我只想去掉足够的空白空间,这样文本就会碰到左边空白......有意义吗? –

4

Cymen给出了正确的解决方案。我使用了从Scala的stripMargin()方法派生出来的类似方法。下面是我的扩展方法是这样的:

public static string StripMargin(this string s) 
{ 
    return Regex.Replace(s, @"[ \t]+\|", string.Empty); 
} 

用法:

var mystring = @" 
     |SELECT 
     | * 
     |FROM 
     | SomeTable 
     |WHERE 
     | SomeColumn IS NOT NULL" 
    .StripMargin(); 

结果:

SELECT 
    * 
FROM 
    SomeTable 
WHERE 
    SomeColumn IS NOT NULL