在生成使用正则表达式的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;
。还有一个未显示的小错误。
答案 0 :(得分:1)
重点是你需要传递一个文字\w+\.\w+@company\.com
字符串。这意味着反斜杠必须是 literal 反斜杠符号,而不是那些形成转义序列的反斜杠(如换行符\n
,\r
表示回车等。)
因此,有两种方法可以在JS中创建正则表达式:构造函数表示法(new RegExp("\\w+\\.\\w+@company\\.com")
)或正则表达式文字表示法(例如/\w+\.\w+@company\.com/
,不需要额外的反斜杠转义{{1}在正则表达式文字中被视为文字反斜杠)。此外,在正则表达式文字中,您必须转义\
符号。
请注意,您需要将整个字符串与正则表达式匹配,因此您也需要/
和^
个锚点。
因此,你需要
$
并且在传递var rex = /^(?:{0})$/i;
时,将所有未转义的regex
替换为/
。