แยก (“ รับ”) ตัวเลขจากสตริง


355

ฉันมีสตริงใน javascript เช่น `# box2 'และฉันต้องการแค่' 2 'จากมัน

พยายาม:

var thestring = $(this).attr('href');
var thenum = thestring.replace( /(^.+)(\w\d+\w)(.+$)/i,'$2');
alert(thenum);

มันยังคงส่งกลับ # box2 ในการแจ้งเตือนฉันจะทำให้มันทำงานได้อย่างไร

จะต้องรองรับจำนวนความยาวใด ๆ ที่แนบมาในตอนท้าย


1
คุณสามารถทำสิ่งนี้ได้ง่ายๆ มันจะทำงานได้ดี var thestring = $ (this) .attr ('href'); var thenum = parsefloat (thestring); การแจ้งเตือน (thenum);
Vivek Shukla

1
รหัสนี้ใช้งานได้ดีสำหรับฉัน แต่สำหรับกรณีหนึ่งฉันมีสตริง '2.5 / ไมล์' และฉันต้องการแยก 2.5 จากนี้ โค้ดด้านบนให้ฉัน 25 แทน 2.5
Bijay Singh

1
ที่เกี่ยวข้อง: stackoverflow.com/q/1862130/1066234
ไก่ Noack

คำตอบ:


578

สำหรับตัวอย่างเฉพาะนี้

 var thenum = thestring.replace( /^\D+/g, ''); // replace all leading non-digits with nothing

ในกรณีทั่วไป:

 thenum = "foo3bar5".match(/\d+/)[0] // "3"

เนื่องจากคำตอบนี้ได้รับความนิยมด้วยเหตุผลบางอย่างนี่คือโบนัส: ตัวสร้าง regex

function getre(str, num) {
  if(str === num) return 'nice try';
  var res = [/^\D+/g,/\D+$/g,/^\D+|\D+$/g,/\D+/g,/\D.*/g, /.*\D/g,/^\D+|\D.*$/g,/.*\D(?=\d)|\D+$/g];
  for(var i = 0; i < res.length; i++)
    if(str.replace(res[i], '') === num) 
      return 'num = str.replace(/' + res[i].source + '/g, "")';
  return 'no idea';
};
function update() {
  $ = function(x) { return document.getElementById(x) };
  var re = getre($('str').value, $('num').value);
  $('re').innerHTML = 'Numex speaks: <code>' + re + '</code>';
}
<p>Hi, I'm Numex, the Number Extractor Oracle.
<p>What is your string? <input id="str" value="42abc"></p>
<p>What number do you want to extract? <input id="num" value="42"></p>
<p><button onclick="update()">Insert Coin</button></p>
<p id="re"></p>


15
-1 "#box2_col3".replace( /^\D+/g, '')ควรจะได้แสดงให้เห็นไม่ได้2 2_col3
Shiplu Mokaddim

2
@ shiplu.mokadd.im: ฉันไม่เห็นการอ้างอิงถึง#box2_col3ในคำถาม
georg

1
#box2_col3ใช่มีการอ้างอิงไม่ แต่ดูที่ regex OP ใช้แล้ว ( \w)(.+$)) ซึ่งระบุอย่างชัดเจนว่ามีตัวอักษรอื่น ๆ อยู่หลังตัวเลข
Shiplu Mokaddim

3
ในกรณีนั้นรูปแบบของคุณจะล้มเหลวหากมีหมายเลขก่อนถึงจุดจบ
Shiplu Mokaddim

2
คุณสามารถreplaceทำงานกับหมายเลขนำโดยใช้: theString.replace(/^.*\D+/g, '');แต่โซลูชันของ shiplu.mokadd.im ดีกว่า
LandonSchropp

226

คุณควรลองสิ่งต่อไปนี้:

var txt = "#div-name-1234-characteristic:561613213213";
var numb = txt.match(/\d/g);
numb = numb.join("");
alert (numb);​

ผลลัพธ์

1234561613213213

1
คำตอบที่ดี แต่ถ้าฉันต้องการชุดของตัวเลขแยกต่างหาก เช่น 1234, 5616133 ...
Amar Singh

หรือแยกหนึ่ง + + แยกเป็นจำนวนเต็ม:parseInt(txt.match(/\d/g).join(''), 10)
Lukas Liesis

" $ 20.0 ".match(/\d/g).join('') => "200" (เพิ่งพูด)
vsync

91

ฉันคิดว่าการแสดงออกปกตินี้จะตอบสนองวัตถุประสงค์ของคุณ:

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

txtสตริงของคุณอยู่ที่ไหน

โดยทั่วไปจะเป็นการฉีกสิ่งที่ไม่ใช่ตัวเลข

ฉันคิดว่าคุณสามารถบรรลุสิ่งเดียวกันโดยใช้สิ่งนี้เช่นกัน:

var num = txt.replace(/\D/g,'');

1
/[^0-9]/g+1 สำหรับการอ่าน ใช้กับคำตอบส่วนใหญ่ได้ที่นี่: stackoverflow.com/q/1862130/1066234
Kai Noack

58

ลองทำสิ่งต่อไปนี้: การดำเนินการstring.replace(/[^0-9]/g, '');นี้จะลบอักขระที่ไม่ใช่ตัวเลขทั้งหมดออกจากตัวเลขในสตริงเท่านั้น

function retnum(str) { 
    var num = str.replace(/[^0-9]/g, ''); 
    return parseInt(num,10); 
}

console.log('abca12bc45qw'.replace(/[^0-9]/g, ''));
console.log('#box2'.replace(/[^0-9]/g, ''));


2
นี้จะดีกว่าคำตอบที่ได้รับการยอมรับเพราะมันไม่เปลี่ยนตัวเลขที่ไม่ใช่ทั้งหมดทั่วโลกและ BTW, สามารถถูกแทนที่ด้วย/[^0-9]/g /[^\d]/g
CPHPython

52

ใช้ฟังก์ชั่นการจับคู่

var thenum = thestring.match(/\d+$/)[0];
alert(thenum);

jsfiddle


1
นอกจากนี้คุณสามารถเพิ่ม unary '+' เพื่อทำให้จำนวนเต็ม var thenum = + thestring.match (/ \ d + $ /) [0];
Sergey Onishchenko

ฉันเดาว่าสิ่งนี้จะใช้ไม่ได้กับหมายเลข> 1 หลัก? (ฉันเข้าใจว่าคำถามนี้เป็นตัวเลข 1 หลัก แต่ฉันกำลังดูตัวเลขที่เป็นไปได้> 10. )
Felix

@nissemand อย่าเดา ลองด้วยตัวเอง แม้ว่าคุณจะไม่ได้เห็นซอ
Shiplu Mokaddim

รักสิ่งนี้. วิธีที่ง่ายที่สุดในการแยกตัวเลขออกเป็นตัวแปรโดยไม่ต้องแตะหรือแก้ไของค์ประกอบ ฉันจะขอบคุณคอมโบที่แต่ละคนสำหรับความบังเอิญหลายอย่างภายในสตริง เช่นสตริง 12a55 รายงานหมายเลขสุดท้ายไม่ใช่ทั้งหมด
m3nda

1
@YevgeniyAfanasyev มันไม่ควร ตรวจสอบคำถามเดิม บรรทัดสุดท้ายเป็นพิเศษ จำนวนควรอยู่ที่ส่วนท้าย
Shiplu Mokaddim

33

ลองชุดค่าผสมทั้งหมดที่อ้างถึงข้างต้นด้วยรหัสนี้และทำให้มันทำงานได้เป็นชุดเดียวที่ทำงานกับสตริงนั้น ->(12) 3456-7890

var str="(12) 3456-7890";
str.replace( /\D+/g, '');

ผลลัพธ์: "1234567890"

Obs:ฉันรู้ว่าสตริงแบบนั้นจะไม่อยู่ใน attr แต่อะไรก็ตามการแก้ปัญหาก็ดีกว่าเพราะมันสมบูรณ์กว่า


ฉันคิดว่าดีกว่าstr.match(/\d+/g).map(Number)ว่ามันจะกลับอาร์เรย์
Artem Bernatskyi

33

และนี่คือตัวอย่างข้อมูลที่แยกราคาด้วยสกุลเงินและการจัดรูปแบบ:

var price = "£1,739.12";
parseFloat(price.replace( /[^\d\.]*/g, '')); // 1739.12

13

คุณอาจใช้วิธีการแยกวิเคราะห์ที่ยอดเยี่ยม

มันจะแปลงตัวเลขนำหน้าให้เป็นตัวเลข

parseInt("-10px");
// will give you -10

18
จะทำงานได้ก็ต่อเมื่อตัวเลขอยู่ที่จุดเริ่มต้นของสตริง
Russj

2
มันกลับมา NaN
Ahmed Syed


4

คุณสามารถใช้การแสดงออกปกติ

var txt="some text 2";
var numb = txt.match(/\d/g);
alert (numb);

ที่จะแจ้งเตือน 2


4
-1 จะไม่ถูกจับตัวเลขหลายหลักและสำหรับการใช้อาร์เรย์ในการแจ้งเตือน
Shiplu Mokaddim

4

ด้วยนิพจน์ทั่วไปวิธีรับตัวเลขจากสตริงตัวอย่างเช่น:

String myString = "my 2 first gifts were made by my 4 brothers";
myString = myString .replaceAll("\\D+","");
System.out.println("myString : " + myString);

ผลลัพธ์ของ myStringคือ " 24"

คุณสามารถดูตัวอย่างรหัสการทำงานนี้ได้ที่นี่: http://ideone.com/iOCf5G


5
java! == javascript - replaceAll ไม่มีอยู่ใน javascript มาตรฐาน เฉพาะบางไลบรารีเช่น jQuery เท่านั้นที่มีวิธีการนั้น ในอนาคตคุณควรชี้แจง
Levi Roberts

3

คุณสามารถใช้ Underscore String Library ดังต่อไปนี้

var common="#box"
var href="#box1"

_(href).strRight(common)

ผลจะเป็น: 1

ดู: https://github.com/epeli/underscore.string

DEMO:
http://jsfiddle.net/abdennour/Vyqtt/
รหัส HTML:

<p>
    <a href="#box1" >img1</a>
    <a href="#box2" >img2</a>
    <a href="#box3" >img3</a>
    <a href="#box4" >img4</a>
</p>
<div style="font-size:30px"></div>

รหัส JS:

var comm="#box"
$('a').click(function(){
  $('div').html(_($(this).attr('href')).strRight(comm))})

หากคุณมีคำต่อท้ายดังต่อไปนี้:

href="box1az" 

คุณสามารถใช้การสาธิตครั้งต่อไป:

http://jsfiddle.net/abdennour/Vyqtt/1/

function retrieveNumber(all,prefix,suffix){
 var left=_(all).strRight(prefix);
 return _(left).strLeft(suffix);

}

3

นี่คือ solt ที่ตรวจสอบไม่มีข้อมูล

var someStr = 'abc'; // add 123 to string to see inverse

var thenum = someStr.match(/\d+/);

if (thenum != null )
{
    console.log(thenum[0]);
}
else
{
 console.log('no number');
}

2

ใช้รหัสบรรทัดเดียวนี้เพื่อรับหมายเลขแรกในสตริงโดยไม่มีข้อผิดพลาด:

var myInt = parseInt(myString.replace(/^[^0-9]+/, ''), 10);

2

โปรดตรวจสอบจาวาสคริปต์ด้านล่างคุณสามารถรับได้เฉพาะหมายเลขเท่านั้น

var txt = "abc1234char5678#!9";
var str = txt.match(/\d+/g, "")+'';
var s = str.split(',').join('');
alert(Number(s));

ผลลัพธ์: 1234567789


2

คุณสามารถแยกตัวเลขจากสตริงโดยใช้นิพจน์ regex:

let string = "xxfdx25y93.34xxd73";
let res = string.replace(/\D/g, "");
console.log(res); 

เอาท์พุท: 25933473


1
var elValue     = "-12,erer3  4,-990.234sdsd";

var isNegetive = false;
if(elValue.indexOf("-")==0) isNegetive=true;

elValue     = elValue.replace( /[^\d\.]*/g, '');
elValue     = isNaN(Number(elValue)) ? 0 : Number(elValue);

if(isNegetive) elValue = 0 - elValue;

alert(elValue); //-1234990.234

โฆษณาคำอธิบาย เช่นทำไมคุณใช้คือ regex นี้
mentallurg

1

คำตอบนี้จะครอบคลุมสถานการณ์ส่วนใหญ่ ฉันสามารถข้ามสถานการณ์นี้เมื่อผู้ใช้พยายามคัดลอกวางหมายเลขโทรศัพท์

  $('#help_number').keyup(function(){
    $(this).val().match(/\d+/g).join("")
  });

คำอธิบาย:

str= "34%^gd 5-67 6-6ds"

str.match(/\d+/g)

มันจะให้อาร์เรย์ของสตริงเป็นผลลัพธ์ >> ["34", "56766"]

str.match(/\d+/g).join("")

เข้าร่วมจะแปลงและเชื่อมต่อข้อมูลอาร์เรย์ที่เป็นสตริงเดียว

เอาท์พุท >> "3456766"

ในตัวอย่างของฉันฉันต้องการผลลัพธ์เป็น 209-356-6788 ดังนั้นฉันจึงใช้แทน

  $('#help_number').keyup(function(){
    $(this).val($(this).val().match(/\d+/g).join("").replace(/(\d{3})\-?(\d{3})\-?(\d{4})/,'$1-$2-$3'))
  });

0
changeStrangeDate(dateString: string) {
var sum = 0;
var numbers = dateString.match(/\d+/g);
if (numbers.length > 1) {
  numbers.forEach(element => {
    sum += parseInt(element);
  }
  );
}
console.log(new Date(sum).toDateString());
return new Date(sum).toUTCString();

}

คุณสามารถทำเช่นนั้นแล้วเรียกฟังก์ชั่นที่คุณต้องการด้วยพารามิเตอร์

this.changeStrangeDate('/Date(1551401820000-0100)/');

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