JavaScript的正则expression式号码只检查

hash = window.location.hash.substr(1); var reg = new RegExp('^[0-9]$'); console.log(reg.test(hash)); 

我在“123”和“123f”都得到了错误。 我想检查散列是否只包含数字。 我错过了什么?

 var reg = /^\d+$/; 

应该这样做。 原件匹配任何只包含一个数字的东西。

正如你所说的,你想散列只包含数字。

 var reg = new RegExp('^[0-9]+$'); 

要么

 var reg = new RegExp('^\\d+$'); 

\d[0-9]都意味着同样的事情。 +使用意味着search一个或多个发生的[0-9]。

这一个也将允许签名和浮点数字或空string:

 var reg = /^-?\d*\.?\d*$/ 

如果你不想让空string使用这个:

 var reg = /^-?\d+\.?\d*$/ 
 var validation = { isEmailAddress:function(str) { var pattern =/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/; return pattern.test(str); // returns a boolean }, isNotEmpty:function (str) { var pattern =/\S+/; return pattern.test(str); // returns a boolean }, isNumber:function(str) { var pattern = /^\d+$/; return pattern.test(str); // returns a boolean }, isSame:function(str1,str2){ return str1 === str2; } }; alert(validation.isNotEmpty("dff")); alert(validation.isNumber(44)); alert(validation.isEmailAddress("mf@tl.ff")); alert(validation.isSame("sf","sf")); 

这对于你的目的来说是极端的矫枉过正,但是这里是我使用的:

 var numberReSnippet = "(?:NaN|-?(?:(?:\\d+|\\d*\\.\\d+)(?:[E|e][+|-]?\\d+)?|Infinity))"; var matchOnlyNumberRe = new RegExp("^("+ numberReSnippet + ")$"); 

就我所知,这与Java和JavaScript将会抛出的所有变体相匹配,包括“-Infinity”,“1e-24”和“NaN”。 它也匹配您可能键入的数字,例如“-.5”。

正如所写的,reSnippet被devise成可以放到其他正则expression式中,所以你可以提取(或避免)数字。 尽pipe所有的括号,它不包含捕获组。 因此,“matchOnlyNumberRe”仅匹配数字的string,并且具有整个string的捕获组。

这里是茉莉花testing,所以你可以看到它做什么,不处理:

 describe("Number Regex", function() { var re = new RegExp("^("+ numberReSnippet + ")$"); it("Matches Java and JavaScript numbers", function() { expect(re.test( "1")).toBe(true); expect(re.test( "0.2")).toBe(true); expect(re.test( "0.4E4")).toBe(true); // Java-style expect(re.test( "-55")).toBe(true); expect(re.test( "-0.6")).toBe(true); expect(re.test( "-0.77E77")).toBe(true); expect(re.test( "88E8")).toBe(true); expect(re.test( "NaN")).toBe(true); expect(re.test( "Infinity")).toBe(true); expect(re.test( "-Infinity")).toBe(true); expect(re.test( "1e+24")).toBe(true); // JavaScript-style }); it("Matches fractions with a leading decimal point", function() { expect(re.test( ".3")).toBe(true); expect(re.test( "-.3")).toBe(true); expect(re.test( ".3e-4")).toBe(true); }); it("Doesn't match non-numbers", function() { expect(re.test( ".")).toBe(false); expect(re.test( "9.")).toBe(false); expect(re.test( "")).toBe(false); expect(re.test( "E")).toBe(false); expect(re.test( "e24")).toBe(false); expect(re.test( "1e+24.5")).toBe(false); expect(re.test("-.Infinity")).toBe(false); }); }); 

这个函数检查它的input是否是经典意义上的数字,因为需要一个正常的数字检测函数。

例如,这是一个可用于HTML表单input的testing。

它绕过了所有的JS民间传说,如tipeof(NaN)= number,parseint('1 Kg')= 1,布尔值被强制为数字等等。

它通过将参数呈现为一个string,并像@ codename那样检查正则expression式的string来实现,但允许像5和5

 function isANumber( n ) { var numStr = /^-?(\d+\.?\d*)$|(\d*\.?\d+)$/; return numStr.test( n.toString() ); } not numeric: Logger.log( 'isANumber( "aaa" ): ' + isANumber( 'aaa' ) ); Logger.log( 'isANumber( "" ): ' + isANumber( '' ) ); Logger.log( 'isANumber( "lkjh" ): ' + isANumber( 'lkjh' ) ); Logger.log( 'isANumber( 0/0 ): ' + isANumber( 0 / 0 ) ); Logger.log( 'isANumber( 1/0 ): ' + isANumber( 1 / 0 ) ); Logger.log( 'isANumber( "1Kg" ): ' + isANumber( '1Kg' ) ); Logger.log( 'isANumber( "1 Kg" ): ' + isANumber( '1 Kg' ) ); Logger.log( 'isANumber( false ): ' + isANumber( false ) ); Logger.log( 'isANumber( true ): ' + isANumber( true ) ); numeric: Logger.log( 'isANumber( "0" ): ' + isANumber( '0' ) ); Logger.log( 'isANumber( "12.5" ): ' + isANumber( '12.5' ) ); Logger.log( 'isANumber( ".5" ): ' + isANumber( '.5' ) ); Logger.log( 'isANumber( "5." ): ' + isANumber( '5.' ) ); Logger.log( 'isANumber( "-5" ): ' + isANumber( '-5' ) ); Logger.log( 'isANumber( "-5." ): ' + isANumber( '-5.' ) ); Logger.log( 'isANumber( "-.5" ): ' + isANumber( '-5.' ) ); Logger.log( 'isANumber( "1234567890" ): ' + isANumber( '1234567890' )); 

正则expression式的解释:

 /^-?(\d+\.?\d*)$|(\d*\.?\d+)$/ 

最初的“^”和最后的“$”匹配string的开始和结束,以确保检查跨越整个string。 “ – ?” 部分是“?”的减号 乘数,允许它的零个或一个实例。

然后有两个类似的小组,用括号划定。 该string必须匹配这些组中的任何一个。 第一个匹配数字如5.和第二个.5

第一组是

 \d+\.?\d* 

“\ d +”匹配一个或多个数字(\ d)。
“\。?” 是小数点(用“\”来避开它的魔法),零次或一次。

最后一部分“\ d *”也是一个数字,零次或多次。
所有的部分都是可选的,但是第一个数字,所以这个组匹配数字如5.而不是.5匹配的另一半。

 ^[0-9]$ 

…是一个匹配任何单个数字的正则expression式,所以1将返回true,但123将返回false。

如果添加*量词,

 ^[0-9]*$ 

该expression式将匹配任意长度的数字string,123将返回true。 (123f仍然会返回false)。

请注意,在技术上,一个空string是一个长度为0的数字串,所以它将使用^ [0-9] * $返回true。如果只想接受包含一个或多个数字的string,则使用+而不是*

 ^[0-9]+$ 

正如其他人所指出的那样,实现这一点的途径有很多,但我觉得应该指出,原始问题中的代码只需要一个额外的字符即可按预期工作。

你需要*所以它说“零个或更多的前一个字符”,这应该这样做:

 var reg = new RegExp('^\\d*$'); 

如果您只需要正整数,并且不需要前导零(例如“0001234”或“00”):

 var reg = /^(?:[1-9]\d*|\d)$/; 

在input时,如果要过滤掉其他字符,只在input字段中显示数字,则可以replacekeyup上的字段值:

  var yourInput = jQuery('#input-field'); yourInput.keyup(function() { yourInput.val((yourInput.val().replace(/[^\d]/g,''))) }) 

如果数字不应该是荒谬的巨大,也许使用:

 new RegExp( '^' + // No leading content. '[-+]?' + // Optional sign. '(?:[0-9]{0,30}\\.)?' + // Optionally 0-30 decimal digits of mantissa. '[0-9]{1,30}' + // 1-30 decimal digits of integer or fraction. '(?:[Ee][-+]?[1-2]?[0-9])?' + // Optional exponent 0-29 for scientific notation. '$' // No trailing content. ) 

这试图避免一些情况,以防万一:

  • 溢出任何缓冲区的原始string可能会传递给。
  • 1E-323这样的非正常数字引起的缓慢或古怪。
  • 预期有限数字时传递Infinity (尝试1E309-1E309 )。

我看到你已经得到了很多的答案,但是如果你正在寻找一个可以匹配整数和浮点数的正则expression式,那么这个答案将会适用于你:

 var reg = /^-?\d*\.?\d+$/; 
 /^[\+\-]?\d*\.?\d+(?:[Ee][\+\-]?\d+)?$/ 

仅数字正则expression式( 更新

  var reg = new RegExp('[^0-9]','g'); 

如果要将数字与签名值相匹配,可以使用:

 var reg = new RegExp('^(\-?|\+?)\d*$'); 

它将validation格式的数字:+1,-1,1。

为什么不使用像这样的东西:

 $.isNumeric($(input).val()) 

是jQuerytesting,最常见的情况下检查

 var pattern = /[0-9!"£$%^&*()_+-=]/; 

这试图避免一些情况,以防万一:

溢出任何缓冲区的原始string可能会传递给。 像1E-323这样的非正常数字引起的缓慢或古怪。 预期有限数字时传递无穷大(尝试1E309-1E309 )。