C# 如何将正则表达式的字符串转换为字符串文字
我想通过动态构建模式来进行一些regex.match。以下代码不起作用。我想知道如何将字符串“^[ABCDEFG][ABCDEFG]$”转换为@“^[ABCDEFG][ABCDEFG]$”并将其用于正则表达式 谢谢C# 如何将正则表达式的字符串转换为字符串文字,c#,regex,C#,Regex,我想通过动态构建模式来进行一些regex.match。以下代码不起作用。我想知道如何将字符串“^[ABCDEFG][ABCDEFG]$”转换为@“^[ABCDEFG][ABCDEFG]$”并将其用于正则表达式 谢谢 static string Convert(string s) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < s.Length; i++) {
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();
}
静态字符串转换(字符串s)
{
StringBuilder sb=新的StringBuilder();
对于(int i=0;i
您正在构建一个接受字符a-G的正则表达式,但您的输入字符串包含一个“U”。您正在构建一个接受字符a-G的正则表达式,但您的输入字符串包含一个“U”。代码没有问题,它工作正常
它创建一个正则表达式,该正则表达式匹配范围a到G中的两个字符
对于字符串“UA”,它不会写入消息“match”
如果您将字符串更改为例如“BA”,它将写入消息。代码没有问题,工作正常 它创建一个正则表达式,该正则表达式匹配范围a到G中的两个字符 对于字符串“UA”,它不会写入消息“match” 如果您将字符串更改为例如“BA”,它将写入消息。字符串
“^[ABCDEFG][ABCDEFG]$”
和@“^[ABCDEFG][ABCDEFG]$”
相同,没有可转换的内容
@
只对C#编译器说,下面的字符串文字不会有任何转义序列,应该将\
作为\
而不是转义序列的开头
因此:
==“你好”
@“你好”
==“^[ABCDEFG][ABCDEFG]$”
@“^[ABCDEFG][ABCDEFG]$”
!=<代码>@“Foo\n”“Foo\n”
=“Foo\\n”
@“Foo\n”
“^[ABCDEFG][ABCDEFG]$”
和@“^[ABCDEFG][ABCDEFG]$”
完全相同,没有任何可转换的内容
@
只对C#编译器说,下面的字符串文字不会有任何转义序列,应该将\
作为\
而不是转义序列的开头
因此:
==“你好”
@“你好”
==“^[ABCDEFG][ABCDEFG]$”
@“^[ABCDEFG][ABCDEFG]$”
!=<代码>@“Foo\n”“Foo\n”
=“Foo\\n”
@“Foo\n”
@
)只是为了允许更简单的文件系统访问和正则表达式编写,因为在逐字字符串中,\
字符不被视为转义字符。这样,您就不必编写“\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\/code>来匹配正则表达式中的字符串,而只需编写“\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
以下示例将证明逐字记录字符串与普通字符串没有区别:
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));
}
}
逐字字符串(以@
为前缀的字符串文字)仅用于允许更简单的文件系统访问和正则表达式编写,因为在逐字字符串中,\
字符不被视为转义字符。这样,您就不必编写“\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\/code>来匹配正则表达式中的字符串,而只需编写“\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
以下示例将证明逐字记录字符串与普通字符串没有区别:
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));
}
}
什么“字符串文字问题”?有什么问题?@“^[ABCDEFG]$”vs“^[ABCDEFG]$”嗯?在你的问题中,你真的需要更明确地说明你想做什么。“下面的代码不起作用”这是编程中最没有价值的语句。你真的应该描述一下它是如何不起作用的。编译错误?运行时故障?行为与预期不同?(那么,您期望得到什么,您实际看到了什么?)可以在C#中定义逐字记录字符串,方法是在字符串文本前面加上@
,例如@“我不需要转义:\”
,如果这是您的意思的话。但到底出了什么问题?什么“字符串文字问题”?有什么问题?@“^[ABCDEFG]$”vs“^[ABCDEFG]$”嗯?在你的问题中,你真的需要更明确地说明你想做什么。“下面的代码不起作用”这是编程中最没有价值的语句。你真的应该描述一下它是如何不起作用的。编译错误?运行时故障?行为与预期不同?(那么,您期望得到什么,您实际看到了什么?)可以在C#中定义逐字记录字符串,方法是在字符串文本前面加上@
,例如@“我不需要转义:\”
,如果这是您的意思的话。但到底出了什么问题?好吧,在这种情况下,你必须定义“不工作”@Mavershang:打字错误?那么听起来您没有显示实际使用的代码,而是键入了其他代码?如果是这样的话,那么就不可能从你的问题中判断出你实际使用的代码有什么问题……使用CA而不是UA,对我来说也很好