2012-01-26 55 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"

注:您的代码是确定,预期应该工作。