ลบอักขระตัวแรกของสตริงใน Javascript


505

ฉันต้องการลบอักขระตัวแรกของสตริงถ้าอักขระตัวแรกคือ 0 0 สามารถมีได้มากกว่าหนึ่งครั้ง

มีฟังก์ชั่นง่าย ๆ ที่ตรวจสอบตัวอักษรตัวแรกและลบมันถ้าเป็น 0 หรือไม่?

ตอนนี้ฉันลองใช้slice()งานฟังก์ชั่นJS แต่มันค่อนข้างอึดอัดมาก

คำตอบ:


763

คุณสามารถลบอักขระตัวแรกของสตริงโดยใช้substr:

var s1 = "foobar";
var s2 = s1.substr(1);
alert(s2); // shows "oobar"

ในการลบ 0 ทั้งหมดที่จุดเริ่มต้นของสตริง:

var s = "0000test";
while(s.charAt(0) === '0')
{
 s = s.substr(1);
}

11
@ สตีเฟ่น: ในกรณีนี้มันจะไม่สร้างความแตกต่างเพราะcharAtจะส่งกลับสตริงเสมอแม้ว่าดัชนีจะเกินดัชนีของอักขระตัวสุดท้ายดังนั้นจึงไม่มีการบังคับประเภทและอัลกอริทึมก็สิ้นสุดลง แต่ฉันชอบ===มากกว่า==แม้ว่าจะไม่ได้สร้างความแตกต่าง ;)
user113716

4
@Hejner: หากประเภทเดียวกันเหมือนที่เคยเป็นในกรณีนี้จากนั้น===และ==ดำเนินการขั้นตอนเดียวกันอย่างแม่นยำ (ตามสเป็คอย่างน้อย) ดังนั้นจึงไม่มีเหตุผลที่จะคาดหวังว่าคนใดคนหนึ่งจะทำงานได้ดีกว่าคนอื่น .
Tim Down

2
@MiguelCoder ตามข้อกำหนดขั้นตอนเหมือนกัน (การใช้งานเบราว์เซอร์อาจแตกต่างกันแน่นอน) อ่านถ้าคุณไม่เชื่อฉัน
Tim Down

3
@ReallyNiceCode ใส่ความจริงที่ว่าคำถามถูกถามเมื่อ 8 ปีที่แล้ว มีการระบุว่า "0 สามารถอยู่ได้มากกว่าหนึ่งครั้ง" และผู้ถามยอมรับทางออกของฉัน
แรเงา

6
แม้ว่าจะยังคงถูกต้องคุณควรปรับปรุงตอบกลับของคุณโดยการแทนที่ด้วยsubstr substringตรวจสอบ MDN: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Soul Reaver

186

รหัสที่อ่านง่ายมากคือการใช้.substring()กับชุดเริ่มต้นเป็นดัชนีของอักขระที่สอง (1) (อักขระแรกมีดัชนี 0) พารามิเตอร์ที่สองของ.substring()วิธีนี้เป็นทางเลือกดังนั้นคุณไม่จำเป็นต้องโทร.length()...

TL; DR: ลบอักขระตัวแรกออกจากสตริง:

str = str.substring(1);

... ใช่มันเป็นเรื่องง่ายที่ ...

การลบตัวอักขระบางตัว:

ตามที่ @Shaded แนะนำให้วนซ้ำสิ่งนี้ในขณะที่อักขระตัวแรกของสตริงของคุณคืออักขระ "ไม่พึงประสงค์" ...

var yourString = "0000test";
var unwantedCharacter = "0";
//there is really no need for === check, since we use String's charAt()
while( yourString.charAt(0) == unwantedCharacter ) yourString = yourString.substr(1);
//yourString now contains "test"

.slice()เทียบ.substring()กับ.substr()

อ้างจาก (และอื่น ๆ ในนั้น) ความแตกต่างระหว่าง String.slice และ String.substring คืออะไร?

นอกจากนี้เขายังชี้ให้เห็นว่าหากพารามิเตอร์ของชิ้นเป็นลบพวกเขาอ้างอิงสตริงจากท้ายที่สุด สตริงย่อยและสตริงย่อยไม่


84

การใช้งานและ.charAt().slice()

ตัวอย่าง: http://jsfiddle.net/kCpNQ/

var myString = "0String";

if( myString.charAt( 0 ) === '0' )
    myString = myString.slice( 1 );

ถ้าอาจจะมีหลาย0ตัวละครที่จุดเริ่มต้นคุณสามารถเปลี่ยนไปif()while()

ตัวอย่าง: http://jsfiddle.net/kCpNQ/1/

var myString = "0000String";

while( myString.charAt( 0 ) === '0' )
    myString = myString.slice( 1 );

61

วิธีที่ง่ายที่สุดในการตัดส่วนนำทั้งหมด0คือ:

var s = "00test";
s = s.replace(/^0+/, "");

หากคุณลอก0ตัวละครนำเพียงตัวเดียวตามที่บอกเป็นนัยคุณสามารถใช้

s = s.replace(/^0/, "");


16

คุณลองใช้substringฟังก์ชั่นนี้หรือไม่?

string = string.indexOf(0) == '0' ? string.substring(1) : string;

นี่คือข้อมูลอ้างอิง - https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/String/substring

และคุณสามารถทำเช่นนี้ได้หลาย ๆ 0:

while(string.indexOf(0) == '0')
{
    string = string.substring(1);
}

7
var s = "0test";
if(s.substr(0,1) == "0") {
    s = s.substr(1);
}

สำหรับทุกคน0: http://jsfiddle.net/An4MY/

String.prototype.ltrim0 = function() {
 return this.replace(/^[0]+/,"");
}
var s = "0000test".ltrim0();

ใช่มันจะได้ผลถ้ามีเพียง 0 ตัวที่อยู่ในสตริง แต่ฉันต้องการมันด้วยถ้าสตริงดูเหมือน var s = "00test0"; ดังนั้นจะต้องแทนที่เฉพาะ 0 สองตัวแรกเท่านั้น
Jings

1
ทำไมcharAtล่ะ ทำไมต้องเลือกวงเล็บ? ทำไมต้องเป็นส่วนขยายต้นแบบ yuck
Ry-

6
//---- remove first and last char of str    
str = str.substring(1,((keyw.length)-1));

//---- remove only first char    
str = str.substring(1,(keyw.length));

//---- remove only last char    
str = str.substring(0,(keyw.length));

4

String.prototype.trimStartWhile = function(predicate) {
    if (typeof predicate !== "function") {
    	return this;
    }
    let len = this.length;
    if (len === 0) {
        return this;
    }
    let s = this, i = 0;
    while (i < len && predicate(s[i])) {
    	i++;
    }
    return s.substr(i)
}

let str = "0000000000ABC",
    r = str.trimStartWhile(c => c === '0');
    
console.log(r);


3

นี่คือสิ่งที่ไม่ถือว่าอินพุตเป็นstring, ใช้substring, และมาพร้อมกับการทดสอบสองหน่วย:

var cutOutZero = function(value) {
    if (value.length && value.length > 0 && value[0] === '0') {
        return value.substring(1);
    }

    return value;
};

http://jsfiddle.net/TRU66/1/



0
var test = '0test';
test = test.replace(/0(.*)/, '$1');

2
สิ่งนี้ไม่ทำงานตามที่คาดไว้และไม่มีประสิทธิภาพจริงๆ
Ry-

0

จากการนำ Javascript ไปใช้งาน trim ()> ที่ลบและนำหน้าหรือสิ้นสุดช่องว่างออกจากสตริง นี่คือการใช้คำตอบสำหรับคำถามนี้ที่เปลี่ยนแปลงไป

var str = "0000one two three0000"; //TEST  
str = str.replace(/^\s+|\s+$/g,'0'); //ANSWER

การใช้งานดั้งเดิมสำหรับสิ่งนี้ใน JS

string.trim():
if (!String.prototype.trim) {
 String.prototype.trim = function() {
  return this.replace(/^\s+|\s+$/g,'');
 }
}

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