2012-01-26 99 views
0

我想通過動態構建模式來執行一些正則表達式匹配。以下代碼不起作用。我想知道如何將字符串「^ [ABCDEFG] [ABCDEFG] $」轉換爲@「^ [ABCDEFG] [ABCDEFG] $」並將其用於正則表達式。如何將字符串轉換爲正則表達式的字符串

感謝

static string Convert(string s) 
    { 
     StringBuilder sb = new StringBuilder(); 
     for (int i = 0; i < s.Length; i++) 
     { 
      if (s[i].Equals('N')) 
      { 
       sb.Append("[ABCDEFG]"); 
      } 
      else 
      { 
       sb.Append(s[i]); 
      } 
     } 
     return sb.ToString(); 
    } 



    static void Main(string[] args) 
    { 
     string seq = "CA"; 
     Regex re = new Regex(Convert("^NN$")); 
     if (re.Match(seq).Success) 
     { 
      Console.WriteLine("match"); 
     } 



     Console.ReadKey(); 
    } 
+5

什麼「字符串literial問題」?問題是什麼? – 2012-01-26 22:23:32

+0

@「^ [ABCDEFG] $」vs「^ [ABCDEFG] $」 – Mavershang 2012-01-26 22:26:07

+0

咦?你真的需要在你想要做什麼的問題上更加明確。 – JohnFx 2012-01-26 22:27:28

回答

0

逐字的字符串(字符串字面一個@前綴)只是sytactic糖,讓簡單的文件系統訪問和正則表達式寫作,因爲在逐字字符串的字符\不作爲轉義字符處理。這樣,您不必編寫"\\\\\\.\\\\",以便在正則表達式中匹配字符串"\.\",但只有@"\\\.\\"不易出錯,因爲隨着數字減少,計算反斜槓變得更容易。

下面的例子將證明逐字字符串沒有異於常人的:

public class Program 
{ 
    public string GetString(bool verbatim) 
    { 
     if(verbatim) 
     { 
      return @"this is a test"; 
     } 
     else 
     { 
      return "this is a test"; 
     } 
    } 

    public static void Main(string[] args) 
    { 
     var verbatim = GetString(true); 
     var normal = GetString(false); 

     // should print 'true', if I'm not mistaken, because of string interning 
     Console.WriteLine("Reference equals:" + ReferenceEquals(verbatim, normal)); 

     // will definitely print 'true' 
     Console.WriteLine("Equals:" + verbatim.Equals(normal)); 
    } 
} 
2

你需要建立一個接受字符的-G正則表達式,但你的輸入字符串包含一個「U」。

+0

這是一個錯字。抱歉。 – Mavershang 2012-01-26 22:27:26

+0

好的,在這種情況下,您將不得不定義「不工作」 – GolfWolf 2012-01-26 22:30:24

+3

@Mavershang:錯字?那聽起來你沒有展示你實際使用的代碼,而是輸入了其他一些代碼?如果是這樣的話,那麼就不可能從你的問題中知道你實際使用的代碼有什麼問題...... – Guffa 2012-01-26 22:32:26

2

代碼沒有問題,它工作得很好。

它創建的是,在範圍A匹配兩個字符來G.

以字符串「UA」正則表達式它不會寫消息「匹配」。

如果將字符串更改爲例如「BA」,則會寫入該消息。

0

字符串"^[ABCDEFG][ABCDEFG]$"@"^[ABCDEFG][ABCDEFG]$"是相同的,沒有什麼可轉換的。

@只是說來,下面的字符串字面量不會有任何轉義序列,並應採取\\,而不是一個轉義序列的開始C#編譯器。

因此:

  • "Hello" == @"Hello"
  • "^[ABCDEFG][ABCDEFG]$" == @"^[ABCDEFG][ABCDEFG]$"

但:

  • "Foo \n" = @"Foo \n"

  • "Foo \\n" == @"Foo \n"

注:您的代碼是確定,預期應該工作。