Regex ใช้ javascript เพื่อคืนค่าตัวเลข


129

หากฉันมีสตริงเช่น "something12" หรือ "something102" ฉันจะใช้ regex ใน javascript เพื่อส่งกลับเฉพาะส่วนตัวเลขได้อย่างไร

คำตอบ:


226

นิพจน์ทั่วไป:

var numberPattern = /\d+/g;

'something102asdfkj1948948'.match( numberPattern )

สิ่งนี้จะส่งคืนอาร์เรย์ที่มีสององค์ประกอบภายใน '102' และ '1948948' ดำเนินการตามที่คุณต้องการ ถ้ามันไม่ตรงกับใด ๆ มันจะกลับเป็นโมฆะ

ในการเชื่อมต่อพวกเขา:

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

สมมติว่าคุณไม่ได้จัดการกับทศนิยมที่ซับซ้อนนี่น่าจะพอแล้ว


3
ทำผิดพลาด เกลียดที่จะเป็นคนจู้จี้จุกจิก แต่นี่จะส่งกลับอาร์เรย์ไม่ใช่วัตถุ (อย่างน้อยในโครเมี่ยม)
Maus

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 ต้องการ "แค่ส่วนตัวเลข" ไม่ใช่สตริง
Scott Fraley

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 นิพจน์ปกติ Parser & Visualizer

ปรับปรุง:

นี่เป็นอีกคนหนึ่งที่คุณยังสามารถดีบัก regexp: ทดสอบ regex ออนไลน์และดีบัก

ปรับปรุง:

อีกที่หนึ่ง: 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"]* null
SơnTrần-Nguyễn

2

คำตอบที่ให้นั้นไม่ตรงกับคำถามของคุณซึ่งบ่งบอกถึงจำนวนต่อท้าย นอกจากนี้โปรดจำไว้ว่าคุณได้รับสายกลับ; หากคุณต้องการตัวเลขจริง ๆให้ส่งผลลัพธ์:

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

หากคุณกำลังจัดการกับรหัสรายการที่เป็นตัวเลขบนหน้าเว็บโค้ดของคุณอาจยอมรับได้อย่างเป็นประโยชน์Elementดึงตัวเลขจากid(หรือผู้ปกครองคนแรกของมันด้วยid); หากคุณมีEventประโยชน์คุณก็น่าจะได้ประโยชน์Elementจากสิ่งนั้นเช่นกัน


ในขณะที่นี่เป็นคำตอบที่ดีฉันไม่คิดว่าคำตอบอื่น ๆ "ไม่ตรงกับ [คำถาม] คำถาม" ในความเป็นจริงแล้วคำตอบอื่น ๆ นั้นมีความหลากหลายมากกว่า พวกเขาจะทำงานกับตัวเลขต่อท้ายเช่นเดียวกับตัวเลขที่อยู่ตรงกลาง มันค่อนข้างเกรงใจที่จะสมมติว่า OP ต้องการให้ทำงานกับหมายเลขต่อท้ายเท่านั้น
Xandor


2

IMO # 3 คำตอบในเวลานี้โดย 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 และ% เครื่องหมายจุลภาคและการใช้พื้นที่ที่ไม่สอดคล้องกันและการเพิ่มจุด / รอบระยะเวลา " โปรดแจ้งให้เราทราบหากฉันทำอะไรหาย สิ่งเดียวที่ฉันเห็นว่ามันไม่ได้จัดการคือตัวเลขทศนิยมที่มีรูปแบบไม่ดีเช่น "0..8"

หากคุณต้องการอาเรย์ของตัวเลขคุณสามารถแปลงอาเรย์ทั้งหมดในรหัสบรรทัดเดียวกัน:

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

รหัสเฉพาะของฉันซึ่งแยกวิเคราะห์ฟังก์ชั่น CSS ไม่จำเป็นต้องกังวลเกี่ยวกับการใช้ตัวอักษรที่ไม่ใช่ตัวเลขของตัวอักษร dot / period ดังนั้นการแสดงออกปกติอาจทำได้ง่ายขึ้น:

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


1

เป็นต่อ @ คำตอบของ Syntle Uncaught TypeError: Cannot read property 'join' of nullถ้าคุณมีตัวละครที่เป็นตัวเลขเพียงคนเดียวไม่ใช่คุณจะได้รับ

วิธีนี้จะป้องกันข้อผิดพลาดหากไม่พบการแข่งขันและส่งคืนสตริงว่าง:

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


0

หากคุณต้องการให้คั่นด้วยจุด / เครื่องหมายจุลภาคแล้ว:

\d*\.?\d*

หรือ

[0-9]*\.?[0-9]*

คุณสามารถใช้https://regex101.com/เพื่อทดสอบ regexes ของคุณ


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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.