如何将资源中的正则表达式模式插入 string.Format?

How to insert a regular expression pattern from resources into a string.Format?

在生成使用正则表达式的 JavaScript 代码时,我发现从字符串变量插入正则表达式模式时出现问题。内容是从资源文件中读取的。

在我看来,问题出在使用 string.Format 插入模板字符串时的反斜杠解释。 JavaScript 似乎没问题;但是,正则表达式与正确的文本不匹配。

正则表达式模式定义了公司电子邮件的外观,它在资源文件中定义(首先读入字符串变量)。它看起来像这样:"\w+\.\w+@company.com"。它应该将用户与电子邮件相匹配,例如 john.doe@company.com。如果不匹配,JavaScript 代码要求进一步确认。

相同的 JavaScript(如下所示)在硬连线时工作正常。问题与 JavaScript 代码的动态定义有关。

上下文: 有了 asp.net 按钮的偶数处理程序,我想添加客户端代码。该模式在资源中,因为代码应该为更多公司重用。由于国际化,确认文本在资源中。

    protected void btnSave_Init(object sender, EventArgs e)
    {
        ASPxButton btn = sender as ASPxButton;
        string regex = GetLocalResourceObject("btnSave.RegEx").ToString();
        string txt = GetLocalResourceObject("btnSave.ConfirmText").ToString();
        txt = txt.Replace("\r\n", "\n");   // must be a single line for JavaScript
        string fo = @"
function(s, e) {{
    var rex = new RegExp('{0}', 'i');
    if (!rex.test(email.GetText()))
        e.processOnServer = confirm('{1}');
}}";
        btn.ClientSideEvents.Click = String.Format(fo, regex, txt);
    }

更新: 写入资源文件的字符串看起来像\w+\.\w+@company\.com(单反斜杠,最后一个点的转义固定)。当读取到字符串变量时,反斜杠作为普通字符在里面。从表单中检索到的文本类似于 jiri.novak@company.com。根据建议,创建正则表达式对象的行已更改为 var rex = /^(?:{0})$/i;。还有一个未显示的小错误。

关键是你需要传递一个文字 \w+\.\w+@company\.com 字符串。这意味着反斜杠必须是 literal 反斜杠符号,而不是那些形成 escape sequences 的反斜杠(如 \n 用于换行,\r 用于马车 return,等等)。

因此,有两种方法可以在 JS 中创建正则表达式:构造函数符号 (new RegExp("\w+\.\w+@company\.com")) 或正则表达式文字符号(例如 /\w+\.\w+@company\.com/,不需要额外的反斜杠转义,因为 \ 被视为正则表达式文字中的文字反斜杠)。此外,在正则表达式文字中,您必须转义 / 符号。

请注意,您需要将整个字符串与正则表达式进行匹配,因此您还需要 ^$ 锚点。

因此,您需要

var rex = /^(?:{0})$/i;

并且在传递 regex 时,将所有未转义的 / 替换为 \/