我想通过动态构建模式来做一些regex.match。以下代码无效。我想知道如何将字符串“^ [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();
}
答案 0 :(得分:2)
您正在构建一个接受字符A-G的正则表达式,但您的输入字符串包含“U”。
答案 1 :(得分:2)
代码没有任何问题,它的工作正常。
它创建一个正则表达式,匹配A到G范围内的两个字符。
使用字符串“UA”时,它不会写入消息“匹配”。
如果您将字符串更改为例如“BA”,它将写入消息。
答案 2 :(得分:0)
字符串"^[ABCDEFG][ABCDEFG]$"
和@"^[ABCDEFG][ABCDEFG]$"
相同,无法转换。
@
只对C#编译器说以下字符串文字没有任何转义序列,并且应该\
作为\
,而不是转义序列的开头。
因此:
"Hello"
== @"Hello"
"^[ABCDEFG][ABCDEFG]$"
== @"^[ABCDEFG][ABCDEFG]$"
但:
"Foo \n"
!= @"Foo \n"
,而
"Foo \\n"
== @"Foo \n"
注意:您的代码没问题,应该按预期工作。
答案 3 :(得分:0)
一个逐字字符串(字符串 literal 前缀为@
)只是一种sytactic糖,允许更简单的文件系统访问和正则表达式写入,因为在逐字符串中字符{{1}不被视为转义字符。这样,您不必编写\
来匹配正则表达式中的字符串"\\\\\\.\\\\"
,而只需编写"\.\"
,因为它们的数量减少,因此计算反斜杠变得更容易,因此不容易出错。
以下示例将证明逐字字符串与普通字符串没有区别:
@"\\\.\\"