正则表达式使用JavaScript返回数字


129

如果我有类似“ something12”或“ something102”的字符串,我将如何在javascript中使用正则表达式来仅返回数字部分?

Answers:


226

常用表达:

var numberPattern = /\d+/g;

'something102asdfkj1948948'.match( numberPattern )

这将返回一个数组,其中包含两个元素“ 102”和“ 1948948”。随心所欲地操作。如果不匹配,则返回null。

串联它们:

'something102asdfkj1948948'.match( numberPattern ).join('')

假设您不处理复杂的小数,我想就足够了。


3
呃。讨厌挑剔,但这会返回一个数组,而不是对象(至少在chrome中)。
Maus 2012年

14
所有数组都是对象,不是吗?
meder omuraliev

6
@MuhammadUmer-您尝试过吗?
meder omuraliev

2
@Onza,您错过了反斜杠d,所以.match(/\d+/g)
meder omuraliev

10
@ MuhammadUmer,@ meder:你们两个应该联合起来: parseInt('987d98sf79s7f9s8f9sf'.match(/\d+/gi).join(''))
Joisey Mike

199

您还可以去除所有非数字字符(\D[^0-9]):

let word_With_Numbers = 'abc123c def4567hij89'
let word_Without_Numbers = word_With_Numbers.replace(/\D/g, '');

console.log(word_Without_Numbers)


好吧,除了OP希望“仅数字部分”,而不是字符串。
斯科特·弗雷利

24

对于带有十进制小数和减号的数字,我使用以下代码段:

 var NUMERIC_REGEXP = /[-]{0,1}[\d]*[.]{0,1}[\d]+/g;

'2.2px 3.1px 4px -7.6px obj.key'.match(NUMERIC_REGEXP)
// return ["2.2", "3.1", "4", "-7.6"]

更新:-7/9/2018

找到了一个可让您直观地编辑正则表达式的工具:JavaScript Regular Expression Parser&Visualizer

更新:

这是您甚至可以用来调试正则表达式的另一个工具:在线正则表达式测试器和调试器

更新:

另一个:RegExr

更新:

Regexper Regex Pal


完美的唯一解决方案,适用于小数和负数
ArmaGeddON

17

如果只需要数字:

var value = '675-805-714';
var numberPattern = /\d+/g;
value = value.match( numberPattern ).join([]);
alert(value);
//Show: 675805714

现在您将数字加入


9

我想您想从字符串中获取数字。在这种情况下,可以使用以下方法:

// Returns an array of numbers located in the string
function get_numbers(input) {
    return input.match(/[0-9]+/g);
}

var first_test = get_numbers('something102');
var second_test = get_numbers('something102or12');
var third_test = get_numbers('no numbers here!');

alert(first_test); // [102]
alert(second_test); // [102,12]
alert(third_test); // null

1
为了清楚起见,get_numbers/1返回一个字符串数组,而不是数字。对于你的榜样,它会返回:* ["102"]* ["102", "12"]*空
儿子TRAN-阮

2

给出的答案实际上与您的问题不符,后者暗示一个尾随数字。另外,请记住,您将得到一个字符串。如果您确实需要一个数字,则将结果转换为:

item=item.replace('^.*\D(\d*)$', '$1');
if (!/^\d+$/.test(item)) throw 'parse error: number not found';
item=Number(item);

如果您要处理网页上的数字项目ID,您的代码也可以接受Element,从中提取数字id(或从其第一个父项中提取id);如果您有Event方便,也可以从中获得Element


虽然这是一个不错的答案,但我认为其他答案“实际上并没有匹配该问题”。实际上,其他答案更为通用。他们将使用尾随的数字以及中间的数字。假设OP希望它仅使用尾随数字是有点冒昧。
Xandor


2

如果您要捕获任何数字,则IMO Chen Dachao给出的第三答案是正确的方法,但是正则表达式可以缩短为:

/[-]{0,1}[\d]*[\.]{0,1}[\d]+/g

至:

/-?\d*\.?\d+/g

例如,此代码:

"lin-grad.ient(217deg,rgba(255, 0, 0, -0.8), rgba(-255,0,0,0) 70.71%)".match(/-?\d*\.?\d+/g)

生成此数组:

["217","255","0","0","-0.8","-255","0","0","0","70.71"]

我提供了一个MDN线性渐变示例,因此它可以完全测试regexp,而无需在此处滚动。我认为我已经在负数,小数,单位后缀(如deg和%),逗号和空格使用不一致以及文本“ lin-grad.ient”中包含了多余的点/句号和连字符/破折号等所有可能性”。如果我缺少什么,请告诉我。我只能看到它无法处理的是格式错误的十进制数字,例如“ 0..8”。

如果您确实想要一个数字数组,则可以在同一行代码中转换整个数组:

array = whatever.match(/-?\d*\.?\d+/g).map(Number);

我特定的代码(用于解析CSS函数)无需担心点/句点字符的非数字用法,因此正则表达式甚至可以更简单:

/-?[\d\.]+/g


1

按照@Syntle的回答,如果您只有非数字字符,则会得到一个Uncaught TypeError: Cannot read property 'join' of null

如果找不到匹配项,这将防止错误并返回空字符串:

('something'.match( /\d+/g )||[]).join('')



0

其他解决方案具有的所有功能,但需要一点验证

// value = '675-805-714'
const validateNumberInput = (value) => { 
    let numberPattern = /\d+/g 
    let numbers = value.match(numberPattern)

    if (numbers === null) {
        return 0
    }  

    return parseInt(numbers.join([]))
}
// 675805714
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.