Regex को एक ही स्थान के साथ कई स्थान बदलने के लिए


508

जैसे एक स्ट्रिंग दी:

"कुत्ते की एक लंबी पूंछ है, और यह लाल है!"

किस प्रकार के jQuery या जावास्क्रिप्ट जादू का उपयोग केवल एक स्थान अधिकतम करने के लिए रिक्त स्थान रखने के लिए किया जा सकता है?

लक्ष्य:

"कुत्ते की एक लंबी पूंछ है, और यह लाल है!"

4
क्या आप भी व्हॉट्सएप के टैब कैरेक्टर से मैच करना चाहते हैं?
क्रिस फार्मर

@ क्रिस, हां कृपया, महान सवाल .... इन सभी अलग-अलग उत्तरों के साथ, किसी को यह कैसे पता होना चाहिए कि सबसे कुशल समाधान कौन सा है?
अप्रेंटिस

2
नीचे हर कोई सही है, लेकिन यह सबसे अधिक अनुकूलित रेगेक्स है: str.replace(/ +(?= )/g,'');आप कुछ भी नहीं बदल रहे हैं जो आपके पास नहीं है।
इवान कैरोल

2
प्रदर्शन में कोई ध्यान देने योग्य अंतर नहीं है। आप हमेशा इसे प्रोफाइल कर सकते हैं, लेकिन मुझे संदेह है कि यह इसके लायक होगा। मैं सबसे स्पष्ट के लिए जाऊंगा।
डेमन डेम

@EvanCarroll: सच नहीं है - कम से कम फ़ायरफ़ॉक्स पर। वह संस्करण काफी धीमा चलता है। मेरे उत्तर (नीचे) में प्रोफाइलिंग परिणाम देखें।
एडवर्ड लॉपर

जवाबों:


934

यह देखते हुए कि आप भी कवर टैब, नई-पंक्तियों, आदि करना चाहते हैं बस की जगह \s\s+के साथ ' ':

string = string.replace(/\s\s+/g, ' ');

यदि आप वास्तव में केवल रिक्त स्थान को कवर करना चाहते हैं (और इस प्रकार टैब, नई सूची आदि नहीं), तो ऐसा करें:

string = string.replace(/  +/g, ' ');

4
आपको regex में 'g' ध्वज जोड़ने की भी आवश्यकता है।
राफेल

6
यह तब काम नहीं कर रहा है जब टैब या न्यूलाइन के बजाय रिक्त स्थान की आवश्यकता है। सही? / \ s + / काम कर रहा होगा।
फेबियन

3
यह एक समारोह के रूप में आपके लिए बेहतर होगा जैसे किfunction removeExtraSpaces(string){ return string.replace(/\s{2,}/g, ' ');}
मठ चिलर

5
@ ईथन: जेएस के पास इसके लिए एक अंतर्निहित कार्य है trim():। यह रेगेक्स से तेज है। आप बस string.trim().replace(/\s\s+/g, ' ');या कर सकते हैं string.replace(/\s\s+/g, ' ').trim();
BalusC

4
/\s\s+/gऔर /\s{2,}/gजब तक कि कम से कम दो एक दूसरे से सटे न हों, व्हॉट्सएप के पात्रों से मेल न खाएं, जैसे कि मैच \ t \ t होगा, लेकिन सिंगल \ t से मेल नहीं खाएगा। string.replace(/\s+/g, ' ')सभी सिंगल और मल्टीपल व्हाट्सएप कैरेक्टर सबस्ट्रिंग से मेल खाएंगे और सिंगल स्पेस को रिप्लेस करेंगे।
रीमेकुअल

159

चूंकि आप प्रदर्शन में रुचि रखते हैं, इसलिए मैंने इनको फायरबग के साथ जोड़ दिया। यहां मुझे मिले परिणाम हैं:

str.replace( /  +/g, ' ' )       ->  380ms
str.replace( /\s\s+/g, ' ' )     ->  390ms
str.replace( / {2,}/g, ' ' )     ->  470ms
str.replace( / +/g, ' ' )        ->  790ms
str.replace( / +(?= )/g, ' ')    -> 3250ms

यह फ़ायरफ़ॉक्स पर है, 100k स्ट्रिंग रिप्लेसमेंट चल रहा है।

अगर आप सोचते हैं कि प्रदर्शन एक मुद्दा है, तो मैं आपको अपना स्वयं का प्रोफाइलिंग परीक्षण करने के लिए प्रोत्साहित करता हूं। मनुष्य यह अनुमान लगाने में बुरी तरह से बुरा है कि उनके कार्यक्रमों में अड़चनें कहाँ हैं।

(इसके अलावा, ध्यान दें कि IE 8 के डेवलपर टूलबार में एक प्रोफाइलर भी बनाया गया है - यह जांचने लायक हो सकता है कि प्रदर्शन IE में कैसा है।)


5
jsperf.com/removing-multiple-spaces आगे बढ़ें और JSPerf! अंतिम विधि; ( / +(?= )/g, ' ');IE9 में विफल रहता है, यह दोहरे स्थान छोड़ देता है: "Foo Bar Baz".replace(/ +(?= )/g, ' ');->"Foo Bar Baz"
Nenotlep

कैसे बहुत भिन्न है bw 1 और 2 पंक्ति
विवेक पांडे

@VivekPanday - मुझे लगता है कि ऐसा इसलिए है क्योंकि दूसरी पंक्ति केवल एक ही स्थान के साथ दोहरे स्थान की घटनाओं की जगह ले रही है, जबकि पहली जगह के साथ किसी भी स्थान की जगह ले रही है। यह खोज या वास्तविक प्रतिस्थापन के दौरान बचाया गया समय है या नहीं, मुझे नहीं पता।
मैलिक

यह प्रारंभिक और अनुगामी व्हाट्सएप को नहीं हटाता है। उसके लिए यह उत्तर देखें ।
ईथन

गति कम करके ऑर्डर करने का संपादन। विवेक की और मलोरिक की टिप्पणियां 380 एमएस और 790 एमएस के साथ लाइनों को संदर्भित करती हैं।
स्किप्पी ले ग्रांड गौरौ

43
var str = "The      dog        has a long tail,      and it is RED!";
str = str.replace(/ {2,}/g,' ');

संपादित करें: यदि आप सभी प्रकार के व्हाट्सएप पात्रों को बदलना चाहते हैं तो सबसे कुशल तरीका इस तरह होगा:

str = str.replace(/\s{2,}/g,' ');

अजीब बात है कि आपके टेस्ट स्ट्रिंग में दो जगह भी नहीं है।
जोश स्टोडोला

बस आपको एहसास हुआ कि मैं पहले से ही हाल ही में आया था, +1 :)
औसतन

2
किसी कारण से यह काम नहीं कर रहा है ... "& nbsp;" दिखा रहे हैं ... संभवतः CKEDITOR के कारण ...
AnApprentice

K पता चलता है कि जैकी का पाठ () चीजों को गड़बड़ कर रहा था। तय - धन्यवाद सभी!
अप्रेंटिस

16

यह एक समाधान है, हालांकि यह सभी अंतरिक्ष पात्रों को लक्षित करेगा :

"The      dog        has a long tail,      and it is RED!".replace(/\s\s+/g, ' ')

"The dog has a long tail, and it is RED!"

संपादित करें : यह संभवतः बेहतर है क्योंकि यह 1 या अधिक स्थानों के बाद किसी स्थान को लक्षित करता है:

"The      dog        has a long tail,      and it is RED!".replace(/  +/g, ' ')

"The dog has a long tail, and it is RED!"

वैकल्पिक तरीका:

"The      dog        has a long tail,      and it is RED!".replace(/ {2,}/g, ' ')
"The dog has a long tail, and it is RED!"

मैंने /\s+/स्वयं का उपयोग नहीं किया क्योंकि यह उन स्थानों को बदलता है जो 1 वर्ण को कई बार फैलाते हैं और कम कुशल हो सकते हैं क्योंकि यह आवश्यकता से अधिक लक्षित होता है।

मैं गहराई से इनमें से किसी का भी परीक्षण नहीं किया था अगर वहाँ कीड़े हैं।

इसके अलावा, यदि आप स्ट्रिंग रिप्लेसमेंट को याद रखने जा रहे हैं तो वेरिएबल / प्रॉपर्टी को अपने रिप्लेसमेंट के लिए फिर से असाइन करें, जैसे:

var string = 'foo'
string = string.replace('foo', '')

JQuery.prototype.text का उपयोग करना:

var el = $('span:eq(0)');
el.text( el.text().replace(/\d+/, '') )

1
पहला एक पूरी तरह से व्यर्थ है, \ _ \ _ का अर्थ है, एक \ _ द्वारा पीछा किया जाने वाला एक या अधिक \ _ +, जो कि एक एकल \ _ + तक घटाया जा सकता है, दूसरा उदाहरण अधिक सटीक है क्योंकि हम केवल दोहरे स्थान बदलना चाहते हैं, नहीं newlines, तीसरा अधिक अनुकूलित है क्योंकि यह केवल 2+ रिक्त स्थान वाले उदाहरणों पर लागू होता है। लेकिन str.replace (/ + ((? =) / G, '') ;, केवल 2+ रिक्त स्थान वाले उदाहरणों पर लागू होता है, लेकिन एक अंतरिक्ष कदम के साथ एक स्थान को अधिलेखित करने से बचाता है।
इवान कैरोल

4
EvanCarroll आप विफल हो जाते हैं क्योंकि \ s \ s + निश्चित रूप से \ s + से भिन्न होता है। \ _ \ _ + 't \ t' या 't \ t \ t' से मेल खाएगा, लेकिन 't' से नहीं। और यही सब कुछ है, आप हर f-en सिंगल व्हाट्सएप चरित्र को बदलना नहीं चाहते हैं।
वॉटेन

मैं करता हूँ। पूर्ण-पाठ खोज (और स्निपेट-डिस्प्ले) के लिए उपयोग किया जाता है: कोई रैंडम टैब, नॉन-ब्रेकर या स्पाईमाजिग्स नहीं, कृपया।
T4NK3R

13

मेरे पास यह विधि है, मैं इसे बेहतर नाम की कमी के लिए Derp विधि कहता हूं।

while (str.indexOf("  ") !== -1) {
    str = str.replace(/  /g, " ");
}

इसे JSPerf में चलाने से कुछ आश्चर्यजनक परिणाम मिलते हैं।


2
मैं नरक के रूप में शर्मिंदा होने जा रहा हूं, अगर यह पता चला कि मैंने परीक्षण मामले को वास्तव में तेज किया है: D
Nenotlep

टेस्ट केस उपलब्ध कराना ... बहुत बढ़िया जवाब!
ओयटुन

2
इसने मेरा दिन बना दिया :-) मज़ेदार "व्युत्पन्न" अक्सर सभी "चतुर" होने से बेहतर काम करता है। "Derp स्प्लिट" हालांकि इसके गधे को लात मारी है। फिर भी, उत्थान के योग्य है।
फ्रेड गैंडट

13

एक अधिक मजबूत तरीका: यह प्रारंभिक और अनुगामी रिक्त स्थान को हटाने का भी ध्यान रखता है , यदि वे मौजूद हैं। उदाहरण के लिए:

// NOTE the possible initial and trailing spaces
var str = "  The dog      has a long   tail, and it     is RED!  "

str = str.replace(/^\s+|\s+$|\s+(?=\s)/g, "");

// str -> "The dog has a long tail, and it is RED !"

आपके उदाहरण में वे स्थान नहीं थे, लेकिन वे बहुत ही सामान्य परिदृश्य भी हैं, और स्वीकृत उत्तर केवल उन एकल स्थानों में ट्रिमिंग कर रहे थे, जैसे: "... लाल!", जो कि आमतौर पर आपको आवश्यकता नहीं होगी।


3
मैंने PHP और कार्यों पर इस पैटर्न का उपयोग किया। INR
ब्रूनो रिबेरो

11

और अधिक मजबूत:

फ़ंक्शन ट्रिम (शब्द)
{
    word = word.replace (/ [[^ \ x21- \ x7E] + / g, ''); // गैर-मुद्रण चार्ट को रिक्त स्थान में बदलें
    वापसी शब्द .replace (/ ^ \ s + | \ s + $ / g, ''); // प्रमुख / अनुगामी रिक्त स्थान निकालें
}

8

मैं सुझाव देता हूँ

string = string.replace(/ +/g," ");

बस रिक्त स्थान के लिए
या

string = string.replace(/(\s)+/g,"$1");

एकल रिटर्न में भी कई रिटर्न देने के लिए।


6

मुझे पता है कि मुझे पार्टी में देर हो रही है, लेकिन मैंने एक अच्छा समाधान खोज लिया।

यह रहा:

var myStr = myStr.replace(/[ ][ ]*/g, ' ');

6

यहाँ एक वैकल्पिक समाधान है यदि आप प्रतिस्थापित का उपयोग नहीं करना चाहते हैं (जावास्क्रिप्ट की जगह के बिना स्ट्रिंग में रिक्त स्थान बदलें)

var str="The dog      has a long   tail, and it     is RED!";
var rule=/\s{1,}/g;
str = str.split(rule).join(" "); 
document.write(str);

5

Newbies एट अल के लिए व्यापक अप्रकाशित उत्तर।

यह मेरे जैसे सभी डमियों के लिए है जो आप में से कुछ लोगों द्वारा लिखी गई लिपियों का परीक्षण करते हैं जो काम नहीं करती हैं।

निम्नलिखित 3 उदाहरण निम्नलिखित चरण 3 वेबसाइटों पर विशेष वर्णों और अतिरिक्त रिक्त स्थान को हटाने के लिए उठाए गए कदम हैं (जिनमें से सभी पूरी तरह से काम करते हैं) {1। EtaVisa.com 2. EtaStatus.com 3. Tikun.com} तो मुझे पता है कि ये पूरी तरह से काम करते हैं।

हमने एक समय में 50 से अधिक और NO समस्याओं के साथ मिलकर इनका जंजीर बनाया है।

// यह विशेष वर्णों को हटा दिया गया है + 0-9 और केवल अक्षरों के लिए अनुमति देता है (ऊपरी और कम मामले)

function NoDoublesPls1()
{
var str=document.getElementById("NoDoubles1");
var regex=/[^a-z]/gi;
str.value=str.value.replace(regex ,"");
}

// इसने विशेष वर्णों को हटा दिया और केवल अक्षरों (ऊपरी और निचले भाग) और 0-9 और रिक्त स्थान के लिए अनुमति देता है

function NoDoublesPls2()
{
var str=document.getElementById("NoDoubles2");
var regex=/[^a-z 0-9]/gi;
str.value=str.value.replace(regex ,"");
}

// यह विशेष वर्णों को हटा देता है और केवल अक्षरों (ऊपरी और निचले मामले) और 0-9 और रिक्त स्थान के लिए अनुमति देता है। The .replace (.replace (/ \ s \ s + / g, "") अंत में अत्यधिक रिक्त स्थान को हटा देता है // जब मैं एकल उद्धरण का उपयोग किया, यह काम नहीं किया।

function NoDoublesPls3()
{    var str=document.getElementById("NoDoubles3");
var regex=/[^a-z 0-9]/gi;
str.value=str.value.replace(regex ,"") .replace(/\s\s+/g, " ");
}

:: अगला :: # 3 के रूप में सहेजें a .js// मुझे मेरा NoDoubles.js कहा जाता है

:: अगला :: अपने पृष्ठ में अपने जेएस को शामिल करें

 <script language="JavaScript" src="js/NoDoubles.js"></script>

इसे अपने फॉर्म फ़ील्ड में शामिल करें :: जैसे

<INPUT type="text" name="Name"
     onKeyUp="NoDoublesPls3()" onKeyDown="NoDoublesPls3()" id="NoDoubles3"/>

ताकि यह इस तरह दिखे

<INPUT type="text" name="Name" onKeyUp="NoDoublesPls3()" onKeyDown="NoDoublesPls3()" id="NoDoubles3"/>

यह विशेष वर्णों को हटा देगा, एकल रिक्त स्थान की अनुमति देगा और अतिरिक्त स्थान हटा देगा।


यहाँ क्या हो रहा है? स्वरूपण बहुत टूटा हुआ दिखता है।
Nenotlep


1
var string = "The dog      has a long   tail, and it     is RED!";
var replaced = string.replace(/ +/g, " ");

या यदि आप भी टैब बदलना चाहते हैं:

var replaced = string.replace(/\s+/g, " ");

1
उपयोग + साफ लगता है, लेकिन यह सिंगल स्पेस के साथ सिंगल स्पेस को भी बदल देगा, थोड़ा बेमानी और मुझे यकीन नहीं है लेकिन यह बहुत लंबे टेक्स्ट के साथ परफॉर्मेस की समस्या पैदा कर सकता है।
आह्मेतुनिकल

मैं कम से कम, सबसे सरल समाधान का उपयोग करता हूं, और केवल उस प्रकार के अनुकूलन के बारे में चिंता करता हूं अगर मुझे पता है कि मुझे एक बहुत बड़ी स्ट्रिंग के खिलाफ मिलान करने की आवश्यकता है, उस समय मैं वास्तव में विभिन्न समाधानों को देखूंगा जो देखने के लिए उपाय करेंगे तेज हो। यह अग्रिम में भविष्यवाणी करना मुश्किल हो सकता है कि परीक्षण के बिना सबसे तेज़ क्या होगा; उदाहरण के लिए, जावास्क्रिप्ट दुभाषियों में, कुछ जटिल नियमित अभिव्यक्तियाँ आपको तेजी से JIT संकलित कार्यान्वयन से धीमी व्याख्या करने के लिए स्विच करने का कारण बनेंगी।
ब्रायन कैंपबेल

1

Jquery में ट्रिम () फ़ंक्शन होता है जो मूल रूप से इस "फोटो बार" को "फोओ बार" में बदल देता है।

var string = "  My     String with  Multiple lines    ";
string.trim(); // output "My String with Multiple lines"

यह बहुत अधिक उपयोगी है क्योंकि यह स्वचालित रूप से शुरुआत में और स्ट्रिंग के अंत में खाली स्थानों को हटा देता है। रेगेक्स की जरूरत नहीं


3
जैसा कि आपने कहा, ट्रिम () पर खाली स्थान को हटा शुरुआत और कम से अंत स्ट्रिंग की, लेकिन नहीं स्ट्रिंग के बीच में है, इसलिए, यह काम इस मामले में करता है, उत्पादन सिर्फ होगा "एक से अधिक के साथ मेरा स्ट्रिंग लाइनों "। api.jquery.com/jQuery.trim
egvaldes

1

प्रतिस्थापन का उपयोग नहीं किया जाता है, स्ट्रिंग = string.split (/ \ W + /);



0

हम sed सिस्टम कमांड की मदद से समझाया गया regex का उपयोग कर सकते हैं। समान रेगेक्स का उपयोग अन्य भाषाओं और प्लेटफार्मों में किया जा सकता है।

पाठ को किसी फ़ाइल फ़ाइल परीक्षण में जोड़ें

manjeet-laptop:Desktop manjeet$ cat test
"The dog      has a long   tail, and it     is RED!"

हम सभी रेगेक्स को सिंगल स्पेस के साथ बदलने के लिए निम्न रेगेक्स का उपयोग कर सकते हैं

manjeet-laptop:Desktop manjeet$ sed 's/ \{1,\}/ /g' test
"The dog has a long tail, and it is RED!"

आशा है कि यह उद्देश्य पूरा करता है


0

एक स्थान के साथ कई स्थानों को बदलने के लिए इसे आज़माएं।

<script type="text/javascript">
    var myStr = "The dog      has a long   tail, and it     is RED!";
    alert(myStr);  // Output 'The dog      has a long   tail, and it     is RED!'

    var newStr = myStr.replace(/  +/g, ' ');
    alert(newStr);  // Output 'The dog has a long tail, and it is RED!'
</script>

और पढ़ें @ सिंगल स्पेस के साथ मल्टीपल स्पेस की जगह



0

अधिक नियंत्रण के लिए आप मूल्य को संभालने के लिए प्रतिस्थापित कॉलबैक का उपयोग कर सकते हैं।

value = "tags:HUNT  tags:HUNT         tags:HUNT  tags:HUNT"
value.replace(new RegExp(`(?:\\s+)(?:tags)`, 'g'), $1 => ` ${$1.trim()}`)
//"tags:HUNT tags:HUNT tags:HUNT tags:HUNT"

0

यह स्क्रिप्ट शब्दों और ट्रिम्स के बीच किसी भी सफेद स्थान (कई रिक्त स्थान, टैब, रिटर्न आदि) को हटा देती है:

// Trims & replaces any wihtespacing to single space between words
String.prototype.clearExtraSpace = function(){
  var _trimLeft  = /^\s+/,
      _trimRight = /\s+$/,
      _multiple  = /\s+/g;

  return this.replace(_trimLeft, '').replace(_trimRight, '').replace(_multiple, ' ');
};


0

मुझे पता है कि हमें regex का उपयोग करना है, लेकिन एक साक्षात्कार के दौरान, मुझे USING REGEX के बिना करने के लिए कहा गया था।

@slightlytyler ने नीचे के दृष्टिकोण के साथ आने में मेरी मदद की।

const testStr = "I   LOVE    STACKOVERFLOW   LOL";

const removeSpaces = str  => {
  const chars = str.split('');
  const nextChars = chars.reduce(
    (acc, c) => {
      if (c === ' ') {
        const lastChar = acc[acc.length - 1];
        if (lastChar === ' ') {
          return acc;
        }
      }
      return [...acc, c];
    },
    [],
  );
  const nextStr = nextChars.join('');
  return nextStr
};

console.log(removeSpaces(testStr));


विचार करें: कंसोल.लॉग (testStr.split ("") .filter (s => s.length) .join (""))
dpjanes
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.