ตัดอักขระที่ไม่ใช่ตัวเลขทั้งหมดออกจากสตริงใน JavaScript


701

พิจารณาสถานการณ์ที่ไม่ใช่ DOM ที่คุณต้องการลบอักขระที่ไม่ใช่ตัวเลขทั้งหมดออกจากสตริงโดยใช้ JavaScript / ECMAScript อักขระใด ๆ ที่อยู่ในช่วง0 - 9ควรเก็บไว้

var myString = 'abc123.8<blah>';

//desired output is 1238

คุณจะบรรลุสิ่งนี้ใน JavaScript ธรรมดาได้อย่างไร? โปรดจำไว้ว่านี่เป็นสถานการณ์ที่ไม่ใช่ DOM ดังนั้น jQuery และโซลูชันอื่น ๆ ที่เกี่ยวข้องกับเบราว์เซอร์และกิจกรรมการกดคีย์จึงไม่เหมาะสม

คำตอบ:


1431

ใช้.replaceวิธีการของสตริงกับ regex \Dซึ่งเป็นคลาสตัวอักษรชวเลขที่ตรงกับที่ไม่ใช่ตัวเลขทั้งหมด:

myString = myString.replace(/\D/g,'');

5
ขอบคุณ csj; จะหาข้อมูลเพิ่มเติมได้จากที่\Dใด?
p.campbell

34
นี่คือการอ้างอิง regex เริ่มต้นของฉัน: regular-expressions.info/reference.html คลาสอักขระในตัวแต่ละตัวมีการเติมเต็มในตัว \ d \ D (เมื่อเทียบกับตัวเลขทุกอย่าง แต่หลัก) (อักขระที่คำเมื่อเทียบกับทุกอย่าง แต่คำตัวอักษร) w \ \ W \ s \ S (ช่องว่างเมื่อเทียบกับทุกอย่าง แต่ช่องว่าง)
CSJ

3
เพื่อให้ชัดเจนนี่คือไวยากรณ์สำหรับแทนที่: w3schools.com/jsref/jsref_obj_regexp.aspเนื่องจากเครื่องหมายทับไปข้างหน้าและ "g" เป็นส่วนหนึ่งของคำสั่งนั้นไม่ใช่ส่วนหนึ่งของ RegEx
Mike K

จะreplaceทำงานร่วมกับไวยากรณ์ตรงนี้ในเบราว์เซอร์ทั้งหมดหรือไม่ ดูเหมือนว่าฉันจำได้ว่าได้รับobject has no method 'replace' IE เวอร์ชันเก่ากว่าเมื่อใช้สิ่งนี้กับข้อความที่ฉันจับด้วย jQuery ... หรืออะไรทำนองนั้น
cwd

@cwd ฉันไม่รู้ว่ามีอะไรรองรับในเบราว์เซอร์ในอดีตหรือปัจจุบัน คำถามระบุบริบทที่ไม่ใช่ DOM ดังนั้นจึงเป็นไปได้ว่าผู้โพสต์กำลังเขียนสคริปต์ในสภาพแวดล้อมที่ไม่ใช่เว็บเบราว์เซอร์
csj

355

หากคุณต้องการสิ่งนี้เพื่อปล่อยให้จุดสำหรับตัวเลขลอยใช้สิ่งนี้

var s = "-12345.50 €".replace(/[^\d.-]/g, ''); // gives "-12345.50"

6
ผู้เชี่ยวชาญ regexp ใด ๆ วิธีทำให้สิ่งนี้ยอมให้มีเพียงจุดเดียว (เกี่ยวข้องกับตัวเลขมาก) ขอบคุณ!
Kasperi

1
คุณหมายถึงอะไร ให้อินพุตและเอาต์พุตตัวอย่าง
max4ever

2
ไม่ดี: "aaa 2.9px of bbb.".replace(/[^\d.-]/g, '')2.9.ควรตัดสตริงใด ๆ ที่อาจล้อมรอบหมายเลข ..
vsync

2
@ max4 ไม่ว่าคุณจะช่วยชีวิตฉันไว้อย่างไรขอบคุณสำหรับการจัดการ-คดีหมายเลข (ลบ) :)
Pankaj Parkar

4
@Kasperi อาจจะ:parseFloat("-1234.5.50 €".replace(/[^\d.-]/g, ''))
A. Genedy

50

ใช้นิพจน์ทั่วไปหากการใช้สคริปต์ของคุณรองรับ สิ่งที่ต้องการ:

myString.replace(/[^0-9]/g, '');

12
ด้วยเหตุผลบางอย่างวิธีนี้ดูเหมือนจะอ่านได้มากกว่า [^ \ d]
Arman Bimatov

1
g สำหรับอะไรหลังจากตัวคั่น regex
Native Coder


23

คุณสามารถใช้ RegExp เพื่อแทนที่อักขระที่ไม่ใช่ตัวเลขทั้งหมด:

var myString = 'abc123.8<blah>';
myString = myString.replace(/[^\d]/g, ''); // 1238

22

บางสิ่งบางอย่างตาม:

yourString = yourString.replace ( /[^0-9]/g, '' );

10
ไม่ใช่คำตอบที่ตรงกับคำถามต้นฉบับ แต่เป็นรุ่นที่จัดการกับจุดทศนิยม:yourString = yourString.replace ( /[^0-9.]/g, '' );
Maxim Mai


0

ใน Angular / Ionic / VueJS - ฉันเพิ่งมาด้วยวิธีง่าย ๆ ของ:

stripNaN(txt: any) {
    return txt.toString().replace(/[^a-zA-Z0-9]/g, "");
}

การใช้งานในมุมมอง:

<a [href]="'tel:'+stripNaN(single.meta['phone'])" [innerHTML]="stripNaN(single.meta['phone'])"></a>

0

น่าเสียดายที่ไม่มีคำตอบข้างต้นสำหรับฉัน

ฉันกำลังมองหาการแปลงตัวเลขสกุลเงินจากสตริงเช่น$123,232,122.11(1232332122.11) หรือUSD 123,122.892(123122.892) หรือสกุลเงินใด ๆ เช่น₹ 98,79,112.50(9879112.5) เพื่อให้ได้ผลลัพธ์เป็นตัวเลขรวมถึงตัวชี้ทศนิยม

ต้องสร้าง regex ของฉันเองซึ่งมีลักษณะดังนี้:

str = str.match(/\d|\./g).join('');

0

ฟังก์ชั่นสั้น ๆ เพื่อลบอักขระที่ไม่ใช่ตัวเลขทั้งหมด แต่เก็บทศนิยม (และส่งคืนตัวเลข):

parseNum = str => +str.replace(/[^.\d]/g, '');
let str = 'a1b2c.d3e';
console.log(parseNum(str));


-5

เราอยู่ในปี 2560ตอนนี้คุณสามารถใช้ES2016 ได้แล้ว

var a = 'abc123.8<blah>';
console.log([...a].filter( e => isFinite(e)).join(''));

หรือ

console.log([...'abc123.8<blah>'].filter( e => isFinite(e)).join(''));  

ผลที่ได้คือ

1238

12
นี่เป็นวิธีที่ไม่มีประสิทธิภาพในการดำเนินการนี้
djheru

อะไรที่ไม่มีประสิทธิภาพหรือไม่ดีที่นี่?
Vladislav Kostenko

5
มันแปลงสตริงเป็นอาร์เรย์ของสตริงอักขระเดี่ยวผ่านวิธีสำรองแล้วใช้ฟังก์ชันตัวกรองเหนือ JavaScript ในแต่ละรายการอาร์เรย์ส่งคืนสตริงอาร์เรย์ใหม่เพื่อเข้าร่วมอาร์เรย์นั้นกลับเข้าไปในสตริง Regex รับค่าสตริงและส่งคืนสตริงและการประมวลผลเสร็จสิ้นผ่านรหัสเนทีฟ
ShortFuse
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.