Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 编译替换正则表达式_C#_Regex - Fatal编程技术网

C# 编译替换正则表达式

C# 编译替换正则表达式,c#,regex,C#,Regex,我想构建一个通用正则表达式的正则表达式程序集,我必须在我的项目中使用它。我使用这些正则表达式来匹配模式并替换它。我使用这段代码构建程序集 AssemblyName an = new AssemblyName("MyRegExp"); RegexCompilationInfo[] rciList = { new RegexCompilationInfo(@"\<b\>(.+?)\<\/b\>", RegexOptions.IgnoreCase, "BoldCod

我想构建一个通用正则表达式的正则表达式程序集,我必须在我的项目中使用它。我使用这些正则表达式来匹配模式并替换它。我使用这段代码构建程序集

AssemblyName an = new AssemblyName("MyRegExp");

RegexCompilationInfo[] rciList = { 
    new RegexCompilationInfo(@"\<b\>(.+?)\<\/b\>", RegexOptions.IgnoreCase, "BoldCode", "MyRegExp", true),
    new RegexCompilationInfo(@"\<i\>(.+?)\<\/i\>", RegexOptions.IgnoreCase, "ItalicCode", "MyRegExp", true)
};

Regex.CompileToAssembly(rciList, an);
但是,我找不到指定替换字符串的位置。事实上,我将使用这些regexp替换html文件中的标记。因此,replace字符串也是常量

我不希望调用程序集指定replace字符串,因为它总是相同的,在不同的调用程序集之间

提前感谢您的建议, 费边

编辑1:

也许我说错了我该做什么。我有几个正则表达式,它们总是被相同的模式替换。我用字符串替换所有字符串,用字符串替换字符串,等等

已编译的正则表达式非常好,但我错过了已编译程序集中的替换模式。我设法用一个助手类构建了一个变通方法,即构建一个转换数组

我最初的问题是:这是在编译的正则表达式中指定替换字符串的一种方法吗?

对于类似的事情非常有用。查看由Regex.CompileToAssembly创建的程序集

创建的类型派生自正则表达式。因此,您可以像使用内联创建的正则表达式实例一样使用它们

Re。有问题的编辑:答案似乎是:无法在生成的程序集中包含指定的字符串

AssemblyName an = new AssemblyName("MyRegExp");

RegexCompilationInfo[] rciList = { 
    new RegexCompilationInfo(@"\<b\>(.+?)\<\/b\>", RegexOptions.IgnoreCase, "BoldCode", "MyRegExp", true),
    new RegexCompilationInfo(@"\<i\>(.+?)\<\/i\>", RegexOptions.IgnoreCase, "ItalicCode", "MyRegExp", true)
};

Regex.CompileToAssembly(rciList, an);
但是,由于使用CompileToAssembly意味着一个多步骤的构建过程—创建程序集生成器,运行它以创建程序集,然后引用该程序集—因此可以扩展该程序集以添加其他内容。创建正则表达式程序集,创建替换字符串程序集,然后使用ilmerge将它们合并为一个程序集。

对于类似的事情非常有用。查看由Regex.CompileToAssembly创建的程序集

创建的类型派生自正则表达式。因此,您可以像使用内联创建的正则表达式实例一样使用它们

Re。有问题的编辑:答案似乎是:无法在生成的程序集中包含指定的字符串

AssemblyName an = new AssemblyName("MyRegExp");

RegexCompilationInfo[] rciList = { 
    new RegexCompilationInfo(@"\<b\>(.+?)\<\/b\>", RegexOptions.IgnoreCase, "BoldCode", "MyRegExp", true),
    new RegexCompilationInfo(@"\<i\>(.+?)\<\/i\>", RegexOptions.IgnoreCase, "ItalicCode", "MyRegExp", true)
};

Regex.CompileToAssembly(rciList, an);

但是,由于使用CompileToAssembly意味着一个多步骤的构建过程—创建程序集生成器,运行它以创建程序集,然后引用该程序集—因此可以扩展该程序集以添加其他内容。创建正则表达式程序集,并创建替换字符串程序集,然后使用ilmerge将它们合并为一个程序集。

CompileToAssembly方法似乎不直接支持这一点,因此您必须找到其他方法将替换字符串与正则表达式相关联。如果希望在生成的程序集中存储替换字符串,那么我可以想到的一个选项是在CompileToAssembly的自定义属性第三个参数中指定它

我认为这会为程序集生成自定义属性,而不是为单个正则表达式生成自定义属性,但例如,您可以使用类似备注的内容:您必须自己声明此属性:

[RegexReplaceString("RegexName", "Replacement")]

使用应用程序生成的DLL时,必须添加一些处理来加载替换字符串,并将其与编译的正则表达式对象一起存储在某个类中。这看起来有点困难,但至少可以让您将替换字符串存储在生成的DLL中,如果您的目标是这样的话。

看起来CompileToAssembly方法并不直接支持这一点,因此您必须找到其他方法将替换字符串与正则表达式相关联。如果希望在生成的程序集中存储替换字符串,那么我可以想到的一个选项是在CompileToAssembly的自定义属性第三个参数中指定它

我认为这会为程序集生成自定义属性,而不是为单个正则表达式生成自定义属性,但例如,您可以使用类似备注的内容:您必须自己声明此属性:

[RegexReplaceString("RegexName", "Replacement")]

使用应用程序生成的DLL时,必须添加一些处理来加载替换字符串,并将其与编译的正则表达式对象一起存储在某个类中。这看起来有点困难,但至少可以让您将替换字符串存储在生成的DLL中,如果这是您的目标的话。

我对我的初始问题进行了澄清。我对我的初始问题进行了澄清。好主意,我发现的与您相同,正则表达式不支持在编译时知道替换字符串。同时,我成功地编写了一个Helper类来完成所有的工作。好主意,我发现的和您一样,Regex不支持在编译时知道替换字符串。同时,我设法编写了一个助手类来完成所有的工作。