स्ट्रिंग के प्रारंभ और अंत से रिक्त स्थान ट्रिम करें


152

मैं शीर्षक स्ट्रिंग के प्रारंभ और अंत से रिक्त स्थान को ट्रिम करने का एक तरीका खोजने की कोशिश कर रहा हूं। मैं इसका उपयोग कर रहा था, लेकिन यह काम नहीं कर रहा है:

title = title.replace(/(^[\s]+|[\s]+$)/g, '');

कोई विचार?


1
var s = '1'; s = s.replace (/ ^ \ s + | \ s + $ / g, ''); चेतावनी ('-' + s + '-'); // यह इस तरह से काम करता है, आपको न तो पारेंस या स्क्वायर ब्रेस की आवश्यकता है।
20

2
जावास्क्रिप्ट अब .trimबनाया गया है, इसलिए यह आधुनिक ब्राउज़रों के लिए उत्तर है: stackoverflow.com/a/3000900/29182
Ziggy

इस लेख को देखें: javascriptstutorial.com/blog/trim-string

function trim11 (str) { str = str.replace(/^\s+/, ''); for (var i = str.length - 1; i >= 0; i--) { if (/\S/.test(str.charAt(i))) { str = str.substring(0, i + 1); break; } } return str; }
बद्री जीएस

जवाबों:


216

नोट: 2015 तक, सभी प्रमुख ब्राउज़र (IE> = 9 सहित) String.prototyp.trim () का समर्थन करते हैं । इसका मतलब यह है कि ज्यादातर उपयोग के मामलों के लिए बस str.trim()सवाल पूछने का सबसे अच्छा तरीका है।


स्टीवन लेविथान ने trimप्रदर्शन के मामले में जावास्क्रिप्ट के कई अलग-अलग कार्यान्वयन का विश्लेषण किया ।

उनकी सिफारिश है:

function trim1 (str) {
    return str.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
}

"सामान्य-उद्देश्य कार्यान्वयन जो तेजी से क्रॉस-ब्राउज़र है", और

function trim11 (str) {
    str = str.replace(/^\s+/, '');
    for (var i = str.length - 1; i >= 0; i--) {
        if (/\S/.test(str.charAt(i))) {
            str = str.substring(0, i + 1);
            break;
        }
    }
    return str;
}

"यदि आप सभी ब्राउज़रों में असाधारण तेजी से लंबे तारों को संभालना चाहते हैं"।

संदर्भ


21
नई सफारी (5), क्रोम (5), फ़ायरफ़ॉक्स (3.6) और ओपेरा (10.5) सभी एक देशी स्ट्रिंग ट्रिम विधि का समर्थन करते हैं। यह मामला होने के नाते, मैं String.prototype को एक विधि प्रदान करूँगा, यदि यह मौजूद नहीं है, बल्कि एक नए वैश्विक फ़ंक्शन के साथ है।
केनेबेक

14
String.prototype.trim = String.prototype.trim || function trim() { return this.replace(/^\s\s*/, '').replace(/\s\s*$/, ''); };
कोजीरो

3
मुझे संदेह है कि हाल ही में जावास्क्रिप्ट प्रदर्शन में सुधार के बाद यह परीक्षण अभी भी प्रासंगिक या विश्वसनीय है क्योंकि यह इस उत्तर के समय था।
एडुआर्डो

2
आप दोहरे सफेद वर्णों का उपयोग क्यों कर रहे हैं? उर्फ क्यों इस regex /^\s\s*/और यह एक नहीं/^\s*/
anemonge

क्यों trim1और trim11कैसे?
मार्टी कॉर्टेज़

68

यदि jQuery का उपयोग करना एक विकल्प है:

/**
 * Trim the site input[type=text] fields globally by removing any whitespace from the
 * beginning and end of a string on input .blur()
 */
$('input[type=text]').blur(function(){
    $(this).val($.trim($(this).val()));
});

या केवल:

$.trim(string);

48

जैसा कि @ChaosPandion ने उल्लेख किया है, इस String.prototype.trimविधि को ECMAScript 5 वें संस्करण की विशिष्टता में पेश किया गया है , कुछ कार्यान्वयनों में पहले से ही यह विधि शामिल है, इसलिए सबसे अच्छा तरीका यह है कि मूल कार्यान्वयन का पता लगाएं और इसे तभी घोषित करें जब यह उपलब्ध न हो:

if (typeof String.prototype.trim != 'function') { // detect native implementation
  String.prototype.trim = function () {
    return this.replace(/^\s+/, '').replace(/\s+$/, '');
  };
}

तो आप बस कर सकते हैं:

title = title.trim();

1
यदि संपत्ति एक फ़ंक्शन है, तो मैं हमेशा जाँच के इस मेम द्वारा थोड़ा सा bemused हूं। अगर यह एक कार्य नहीं है तो क्या वास्तव में इसे अधिलेखित करना सही व्यवहार है? शायद आपको उस मामले में एक त्रुटि फेंकनी चाहिए।
कोजीरो

1
@kojiro, ठीक है, शायद एक त्रुटि को फेंकना अच्छा होगा, लेकिन मैं इसे इस तरह से देखता हूं: मैं एक कल्पना-युक्त शिम बनाने की कोशिश कर रहा हूं , और यदि String.prototype.trimकोई फ़ंक्शन नहीं है, तो यह ECMAScript 5 वें संस्करण में वर्णित विधि नहीं है String.prototype.trimविशिष्टता, कल्पना की गारंटी देता है कि trimES5 वातावरण पर एक समारोह वस्तु है।
CMS

7
throw { name: "UnlikelyPolyfillException", message: "Did someone really write a property on the String prototype named 'trim' that isn't a ECMA 5 compatible shim? Come on now, that's crazy." }
कोजिरो

34

मुझे पता है कि यह एक पुरानी पोस्ट है, लेकिन मैंने सोचा कि मैं अपना समाधान साझा करूंगा। सबसे छोटे कोड की तलाश में (हर कोई सिर्फ रीगेक्स को पसंद नहीं करता है ), कोई इसके बजाय उपयोग कर सकता है:

title = title.replace(/(^\s+|\s+$)/g, '');

BTW: मैंने blog.stevenlevithan.com - फास्टर जावास्क्रिप्ट ट्रिम के ऊपर साझा किए गए लिंक के माध्यम से इसी परीक्षा को चलाया और इस पैटर्न ने अन्य सभी हाथों को नीचे गिरा दिया!

IE8 का उपयोग करते हुए, test13 के रूप में जोड़ा गया परीक्षण। परिणाम थे:

मूल लंबाई: 226002
trim1: 110ms (लंबाई: 225994)
trim2: 79ms (लंबाई: 225994)
trim3: 172ms (लंबाई: 225994)
trim4: 203ms (लंबाई: 225994)
trim5: 172ms (लंबाई: 225994)
trim6: 312ms (लंबाई: लंबाई) 225994)
trim7: 203ms (लंबाई: 225994)
trim8: 47ms (लंबाई: 225994)
trim9: 453ms (लंबाई: 225994)
trim10: 15ms (लंबाई: 225994)
trim11: 16ms (लंबाई: 225994)
trim12: 31ms (लंबाई: 225994)
trim13: 0ms (लंबाई: 226002)



11

यहां, आपको वह सब करना चाहिए जो आपको चाहिए

function doSomething(input) {
    return input
              .replace(/^\s\s*/, '')     // Remove Preceding white space
              .replace(/\s\s*$/, '')     // Remove Trailing white space
              .replace(/([\s]+)/g, '-'); // Replace remaining white space with dashes
}

alert(doSomething("  something with  some       whitespace   "));

\ s \ s * बेमानी लगता है, क्योंकि वहाँ \ s + है, लेकिन यह थोड़ा तेज़ है
CaffGeek

4

यहाँ कुछ तरीके हैं जिनका उपयोग मैंने अतीत में js में तारों को ट्रिम करने के लिए किया है:

String.prototype.ltrim = function( chars ) {
    chars = chars || "\\s*";
    return this.replace( new RegExp("^[" + chars + "]+", "g"), "" );
}

String.prototype.rtrim = function( chars ) {
    chars = chars || "\\s*";
    return this.replace( new RegExp("[" + chars + "]+$", "g"), "" );
}
String.prototype.trim = function( chars ) {
    return this.rtrim(chars).ltrim(chars);
}

RegExp स्ट्रिंग की शुरुआत में ^[\s*]+मेल खाता है *, ताकि आपका फ़ंक्शन ट्रिम हो "*** Foo"जाए "Foo"
फर्डिनेंड बेयर

शायद :) आश्चर्य है कि किसी ने शिकायत क्यों नहीं की ... यह एक लंबे समय पहले मैंने उस कोड को लिखा था, और इसका उपयोग en.wikipedia.org/wiki/Wikipedia:Twinkle में किया गया है । बंद स्रोत अब आप यह स्पष्ट है कि यह इंगित करते हैं।
अज़ातोथ

4

यहां मेरा वर्तमान कोड है, यदि मैं तीसरी पंक्ति पर टिप्पणी करता हूं, तो दूसरी पंक्ति काम करती है, लेकिन यदि मैं इसे छोड़ता हूं तो यह काम नहीं करता है।

var page_title = $(this).val().replace(/[^a-zA-Z0-9\s]/g, '');
page_title = page_title.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
page_title = page_title.replace(/([\s]+)/g, '-');

दूसरी और तीसरी पंक्ति को हटाएं, और पॉलीजेनबेलिकुलेंट से कोड का उपयोग करें, पेज_टाइटल = ट्रिम 1 (पेज_टीटल);
चींटी

तो अंततः आप इस स्ट्रिंग को अलग-थलग करने के लिए रिक्त स्थान के बजाय छंटनी, अल्फा-न्यूमेरिक, और डैश को साफ करने की कोशिश कर रहे हैं?
कैफ़े गीक

@ चचा जी। मक्खी पर स्लग URL बनाने के लिए, ताकि उपयोगकर्ता देख सकें कि उनका URL कैसा दिखेगा। नए ब्लॉग पोस्ट बनाते समय वर्डप्रेस इसे कैसे करता है, इसके समान।
जेम्स जेफरी


2

jQuery.trim ("हैलो, आप कैसे हैं?");

:)


2
लगता है कि आप मज़ाक कर रहे होंगे, लेकिन ध्यान रखें कि इस टिप्पणी को पढ़ने वाले लोग आपके समाधान का उपयोग करने और साथ चलने के लिए लुभा सकते हैं।
commadelimited

$ .trim ("blabh blah blah"); सही ढंग से "blabh blah blah"
RAY

2

जब DOM पूरी तरह से लोड हो जाता है, तो आप इसे सभी टेक्स्ट फ़ील्ड में जोड़ सकते हैं। मेरे पास कभी ऐसी स्थिति नहीं थी जहां मुझे अग्रणी या अनुगामी स्थान जमा करने की आवश्यकता थी, इसलिए विश्व स्तर पर हर समय मेरे लिए काम करना ...

$(function() { $('input[type=text]').on('blur', function(){
    $(this).val($.trim($(this).val()));
  });
});

jQuery की आवश्यकता है। एक और सवाल (मैंने इसका परीक्षण नहीं किया): क्या blurवास्तव में सबमिट से पहले होता है जब मैं खेतों में होता हूं और एक फॉर्म भेजने के लिए <kbd> दर्ज </ kbd> करता हूं?
9

2

यह वही है जो जावास्क्रिप्ट वास्तुकार / गुरु डगलस क्रॉकफोर्ड द्वारा सुझाया गया है।

String.method('trim', function (  ) {
    return this.replace(/^\s+|\s+$/g, '');
});

नोट: आपको Function.prototype के लिए "विधि" को परिभाषित करना होगा।

वैकल्पिक रूप से

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

title.trim();    // returns trimmed title

अवलोकन

हाल के ब्राउज़रों में, ट्रिम विधि डिफ़ॉल्ट रूप से शामिल है। इसलिए आपको इसे स्पष्ट रूप से नहीं जोड़ना है।

प्रमुख ब्राउज़र क्रोम, फ़ायरफ़ॉक्स, सफारी आदि ट्रिम विधि का समर्थन करते हैं। Chrome 55.0.2883.95 (64-बिट), फ़ायरफ़ॉक्स 51.0.1 (64-बिट), सफारी 10.0 (12602.1.50.0.10) में जांच की गई।



0

इसके लिए एक पुनरावर्ती प्रयास करें

function t(k){ 
    if (k[0]==' ') {
        return t(k.substr(1,k.length));
    } else if (k[k.length-1]==' ') {
        return t(k.substr(0,k.length-1));
    } else {
        return k;
    }
}

इस तरह से कॉल करें:

t("      mehmet       "); //=>"mehmet"

यदि आप spesific chars फ़िल्टर करना चाहते हैं, तो आप मूल रूप से एक सूची स्ट्रिंग परिभाषित कर सकते हैं:

function t(k){
    var l="\r\n\t "; //you can add more chars here.
    if (l.indexOf(k[0])>-1) {
        return t(k.substr(1,k.length));
    } else if (l.indexOf(k[k.length-1])>-1) {
        return t(k.substr(0,k.length-1));
    } else {
        return k;
    }
}

जो पूछा जा रहा है उसमें से एक सूक्ष्म अंतर है! आप एक स्थान के लिए जाँच कर रहे हैं ' ', लेकिन सवाल सामान्य रूप से सफेद स्थान के बारे में है, जिसमें शामिल हैं "\n", "\t"और अन्य गैर मुद्रण योग्य वर्ण हैं, जो regex द्वारा मेल खाते हैं /\s/
10

उसके बाद अगर आप "अगर (" \ t \ r \ n ".indexOf (k [0])> - 1)" 1 "के रूप में स्थिति को संपादित कर सकते हैं, तो यह अभी भी काम करता है, वे पहले से ही कुछ प्रकार हैं।
मगवेन गुवेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.