如何将资源中的正则表达式模式插入 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
时,将所有未转义的 /
替换为 \/
。
在生成使用正则表达式的 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
时,将所有未转义的 /
替换为 \/
。