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
)。