当我使用.NET引擎测试时,我有一个在regexplib.com上运行的正则表达式。它找不到与JavaScript匹配的内容。我也尝试使用以下代码的JSFiddle。它找不到匹配项。它返回null。
var re = RegExp('^\d+(?:\.\d{0,1})?$');
var myString = "123";
alert(myString.match(re));
我正在尝试在aspx网页中使用以下javascript。它找不到任何匹配项。我对这些想法持开放态度。
function ValidateData(ControlObj, ColumnType) {
var re = new RegExp('^\d+(?:\.\d{0,1})?$');
if (!ControlObj.value.match(re)) {
答案 0 :(得分:8)
最好使用正则表达式文字而不是正则表达式对象:
var re = /^\d+(?:\.\d?)?$/;
var myString = "123";
alert(myString.match(re));
除非您正在动态构建正则表达式,否则无需使用RegExp
对象。
否则RegExp
对象需要双重转义,如:
var re = RegExp('^\\d+(?:\\.\\d?)?$');
双重转义的 原因是RegExp
对象将字符串作为输入,首先需要转义为字符串,第二个需要转义为正则表达式引擎。
btw \d{0,1}
可以替换为\d?
答案 1 :(得分:3)
使用双重转义斜杠:
var re = RegExp('^\\d+(?:\\.\\d{0,1})?$');
它应该有用。
在JavaScript中,您可以使用文字表示法和构造函数。在字面符号中(请参阅anubhava的建议),您需要添加/ ... /
,然后您不需要转义斜杠。使用RegExp
对象(构造函数)时,必须转义反斜杠。
当您需要将变量传递给模式时,构造函数很好。在其他情况下,字面符号是可取的。
var re = /^\d+(?:\.\d?)?$/;
\d{0,1}
与\d?
相同,?
表示0 or 1, greedy
。
请参阅more about that difference on MDN。
文字符号提供正则表达式的编译 何时评估表达式。使用文字符号时 正则表达式将保持不变。例如,如果您使用 用于构造循环中使用的正则表达式的文字符号 正则表达式不会在每次迭代时重新编译。
正则表达式对象的构造函数,例如new RegExp('ab + c'),提供常规的运行时编译 表达。知道常规函数时使用构造函数 表达模式会改变,或者你不知道模式和 从其他来源获取它,例如用户输入。
使用构造函数时,正常的字符串转义规则 (当包含在字符串中时带有\的特殊字符前面) 必要的。