जावास्क्रिप्ट का उपयोग करते हुए दो वर्णों के बीच प्रतिस्थापित करें


194

मैं एक बड़े स्ट्रिंग के भीतर से एक स्ट्रिंग निकालने की कोशिश कर रहा हूं, जहां यह सब कुछ एक ':' और 'a' में मिलता है।

वर्तमान

Str = 'MyLongString:StringIWant;'

वांछित उत्पादन

newStr = 'StringIWant'

जवाबों:


424

आप यह कोशिश कर सकते हैं

var mySubString = str.substring(
    str.lastIndexOf(":") + 1, 
    str.lastIndexOf(";")
);

4
यदि आप नियमित अभिव्यक्ति से बचना चाहते हैं तो विशेष रूप से सामान्य समाधान।
निकोले फ्रिक

8
क्या किसी को पता है कि मैं अपनी शुरुआत और समाप्ति स्ट्रिंग के बीच एक विकल्प की हर घटना के लिए यह कैसे करूंगा?
मार्क्सकोड

6
@VirtualTroll 8 सेकंड? पवित्र नरक मैं आपका "समाधान" देखना चाहता हूं: D
टॉम

@tom हालांकि "8 सेकंड" बिना किसी संदर्भ के कोई सार्थक जानकारी नहीं देता है - लेकिन मुझे पूरा यकीन है कि यह एक रन का अंतर नहीं है)
अहंकार

7
मुझे यकीन है कि उसका मतलब है कि यह जवाब उसके 8 सेकंड पहले पोस्ट किया गया था। जबकि वह लिख रहा था।
मैक्ससेंटोस

111

आप यह भी आज़मा सकते हैं:

var str = 'one:two;three';    
str.split(':').pop().split(';')[0]; // returns 'two'

13
रेगेक्स नहीं। इसे प्यार करना।
flimflam57

str.split(':').pop().split(';')[0]उपयोग करने की तुलना में तेज़ हो सकता है.shift()
मिस्ट्रीपैंक

48

उपयोग split()

var s = 'MyLongString:StringIWant;';
var arrStr = s.split(/[:;]/);
alert(arrStr);

arrStrइसमें सभी स्ट्रिंग को सीमांकित किया जाएगा :या ;
इसके माध्यम से हर स्ट्रिंग को एक्सेस किया जाएगाfor-loop

for(var i=0; i<arrStr.length; i++)
    alert(arrStr[i]);

जो स्ट्रिंग मैं चाहता हूं वह [] के बीच है और यह काम नहीं कर रहा है ... ex: 'MyLongString [StringIant]'। विभाजन (/ [[]] /);
फिलिप

1
@Philippe अपने उपयोग-मामले के लिए, इस regex का उपयोग करें \[(.*?)\] ---> संक्षेप में आपको वर्ग कोष्ठक से बचने की आवश्यकता है, जैसा कि [] regex में वर्ण वर्ग को दर्शाता है।
asifsid88

33

@Babasaheb गोसावी उत्तर एकदम सही है यदि आपके पास सबस्ट्रिंग की एक घटना है (":" और ";")। लेकिन एक बार जब आपके पास कई घटनाएं होती हैं, तो यह थोड़ा मुश्किल हो सकता है।


सबसे अच्छा समाधान मैं कई परियोजनाओं पर काम करने के लिए आया हूं, एक वस्तु के अंदर चार तरीकों का उपयोग कर रहा हूं।

  • पहली विधि: वास्तव में दो तारों के बीच से एक विकल्प प्राप्त करना है (हालांकि यह केवल एक परिणाम प्राप्त करेगा)।
  • दूसरा तरीका: सबसे हाल ही में पाए गए परिणाम के बाद (और बाद में) इसके पहले और बाद के सब्सट्रिंग के साथ हटा देगा।
  • तीसरी विधि: उपरोक्त दोनों विधियों को एक स्ट्रिंग पर पुनरावर्ती रूप से करेंगे।
  • चौथा तरीका: तीसरी विधि को लागू करेगा और परिणाम लौटाएगा।

कोड

इतनी बात करते हुए, आइए देखें कोड:

var getFromBetween = {
    results:[],
    string:"",
    getFromBetween:function (sub1,sub2) {
        if(this.string.indexOf(sub1) < 0 || this.string.indexOf(sub2) < 0) return false;
        var SP = this.string.indexOf(sub1)+sub1.length;
        var string1 = this.string.substr(0,SP);
        var string2 = this.string.substr(SP);
        var TP = string1.length + string2.indexOf(sub2);
        return this.string.substring(SP,TP);
    },
    removeFromBetween:function (sub1,sub2) {
        if(this.string.indexOf(sub1) < 0 || this.string.indexOf(sub2) < 0) return false;
        var removal = sub1+this.getFromBetween(sub1,sub2)+sub2;
        this.string = this.string.replace(removal,"");
    },
    getAllResults:function (sub1,sub2) {
        // first check to see if we do have both substrings
        if(this.string.indexOf(sub1) < 0 || this.string.indexOf(sub2) < 0) return;

        // find one result
        var result = this.getFromBetween(sub1,sub2);
        // push it to the results array
        this.results.push(result);
        // remove the most recently found one from the string
        this.removeFromBetween(sub1,sub2);

        // if there's more substrings
        if(this.string.indexOf(sub1) > -1 && this.string.indexOf(sub2) > -1) {
            this.getAllResults(sub1,sub2);
        }
        else return;
    },
    get:function (string,sub1,sub2) {
        this.results = [];
        this.string = string;
        this.getAllResults(sub1,sub2);
        return this.results;
    }
};

कैसे इस्तेमाल करे?

उदाहरण:

var str = 'this is the haystack {{{0}}} {{{1}}} {{{2}}} {{{3}}} {{{4}}} some text {{{5}}} end of haystack';
var result = getFromBetween.get(str,"{{{","}}}");
console.log(result);
// returns: [0,1,2,3,4,5]

एक RangeError: Maximum call stack size exceededअपवाद हो रही है।
एलेजांद्रो कोटिला

1
बहुत बढ़िया जवाब। यह वही था जो मुझे चाहिए था।
एंड्रेस फेलिप

20
var s = 'MyLongString:StringIWant;';
/:([^;]+);/.exec(s)[1]; // StringIWant

1
का उद्देश्य क्या है; [^?] में
जाको कारू

2
अनुवाद है: "/" पैटर्न शुरू करें। एक ":" के साथ "[]" कुछ भी "^;" का मिलान करें अर्ध-बृहदान्त्र नहीं "+" बार-बार और फिर एक ";" सेमी-कोलोन और "/" पैटर्न को समाप्त करते हैं।
डेवलपर

15

मुझे यह तरीका पसंद है:

var str = 'MyLongString:StringIWant;';
var tmpStr  = str.match(":(.*);");
var newStr = tmpStr[1];
//newStr now contains 'StringIWant'

मैंने SharePoint 2013 वेबपार्ट में इसका परीक्षण किया और महान काम किया अगर भविष्य में किसी को मदद मिले!
शेन गिब।

3
यह काम नहीं कर सकता है यदि आप जो स्ट्रिंग चाहते हैं वह "(" और ")" के बीच है
bravokeyl

4

मैंने @tsds का उपयोग किया लेकिन केवल विभाजित फ़ंक्शन का उपयोग करके।

var str = 'one:two;three';    
str.split(':')[1].split(';')[0] // returns 'two'

सतर्कता का शब्द: अगर थ्रे नहीं है: "" स्ट्रिंग के एक्सेसिंग '1' इंडेक्स में, एरर फेकेंगे! str.split ( ':') [1]

इसलिए @tsds रास्ता सुरक्षित है अगर अनिश्चितता है

str.split(':').pop().split(';')[0]

4
function substringBetween(s, a, b) {
    var p = s.indexOf(a) + a.length;
    return s.substring(p, s.indexOf(b, p));
}

// substringBetween('MyLongString:StringIWant;', ':', ';') -> StringIWant
// substringBetween('MyLongString:StringIWant;;', ':', ';') -> StringIWant
// substringBetween('MyLongString:StringIWant;:StringIDontWant;', ':', ';') -> StringIWant

2 पात्रों के बीच तार के लिए यह एक उत्कृष्ट समाधान है
फणी शशांक

3

आप अपने एक्सट्रैक्टर के 'संकलित' संस्करण को वापस करने के लिए एक उच्च क्रम फ़ंक्शन का उपयोग कर सकते हैं, इस तरह यह तेज़ है।

रेगेक्स के साथ, और एक बार बंद होने के दौरान रेक्स को संकलित करने के साथ, जावास्क्रिप्ट का मैच सभी मैचों को वापस कर देगा।

यह हमें केवल हमारे मार्कर (यानी:) के रूप में उपयोग किए गए को हटाने के लिए छोड़ देता है {{और हम स्लाइस के साथ इसके लिए स्ट्रिंग लंबाई का उपयोग कर सकते हैं।

function extract([beg, end]) {
    const matcher = new RegExp(`${beg}(.*?)${end}`,'gm');
    const normalise = (str) => str.slice(beg.length,end.length*-1);
    return function(str) {
        return str.match(matcher).map(normalise);
    }
}

एक बार संकलित करें और कई बार उपयोग करें ...

const stringExtractor = extract(['{','}']);
const stuffIneed = stringExtractor('this {is} some {text} that can be {extracted} with a {reusable} function');
// Outputs: [ 'is', 'text', 'extracted', 'reusable' ]

या एकल-समय का उपयोग ...

const stuffIneed = extract(['{','}'])('this {is} some {text} that can be {extracted} with a {reusable} function');
// Outputs: [ 'is', 'text', 'extracted', 'reusable' ]

जावास्क्रिप्ट के replaceफ़ंक्शन को भी देखें लेकिन प्रतिस्थापन तर्क के लिए एक फ़ंक्शन का उपयोग करना (आप ऐसा करेंगे कि यदि आप उदाहरण के लिए एक मिनी टेम्पलेट इंजन (स्ट्रिंग इंटरपोलेशन) कर रहे थे ... lodash.get भी मददगार हो सकता है तो उन मूल्यों को प्राप्त करने के लिए जिन्हें आप चाहते हैं। से बदलो ? ...

मेरा जवाब बहुत लंबा है लेकिन यह किसी की मदद कर सकता है!


2

आप भी इस एक का उपयोग कर सकते हैं ...

function extractText(str,delimiter){
  if (str && delimiter){
    var firstIndex = str.indexOf(delimiter)+1;
    var lastIndex = str.lastIndexOf(delimiter);
    str = str.substring(firstIndex,lastIndex);
  }
  return str;
}


var quotes = document.getElementById("quotes");

// &#34 - represents quotation mark in HTML
<div>


  <div>
  
    <span id="at">
      My string is @between@ the "at" sign
    </span>
    <button onclick="document.getElementById('at').innerText = extractText(document.getElementById('at').innerText,'@')">Click</button>
  
  </div>
  
  <div>
    <span id="quotes">
      My string is "between" quotes chars
    </span>
    <button onclick="document.getElementById('quotes').innerText = extractText(document.getElementById('quotes').innerText,'&#34')">Click</button>
  
  </div>

</div>


2

सबस्ट्रिंग के बीच स्ट्रिंग प्राप्त करें (1 से अधिक वर्ण होते हैं)

function substrInBetween(whole_str, str1, str2){
  strlength1 = str1.length;
  return whole_str.substring(
                whole_str.indexOf(str1) + strlength1, 
                whole_str.indexOf(str2)
               );

   }

नोट मैं indexOf()इसके बजाय का उपयोग करें lastIndexOf()तो यह उन तार के पहले घटनाओं के लिए जाँच करेगा


अच्छा और बहुत पठनीय कार्य। लेकिन strlength1चर का उद्देश्य क्या है ? इसके स्थान पर इनलाइन का उपयोग किया जाना चाहिए। यह भी स्पष्ट नहीं है कि आप किस केस शैली का उपयोग कर रहे हैं। strlength1- नो स्टाइल, whole_str- स्नेक केस।
बोरिस

1

जावास्क्रिप्ट का उपयोग करके दो वर्णों के बीच प्रतिस्थापित करने की कोशिश करें।

        $("button").click(function(){
            var myStr = "MyLongString:StringIWant;";
            var subStr = myStr.match(":(.*);");
            alert(subStr[1]);
        });

@ से लिया गया jQuery के साथ दो वर्णों के बीच प्रतिस्थापन खोजें


1

JQuery का उपयोग करना :

get_between <- function(str, first_character, last_character) {
    new_str = str.match(first_character + "(.*)" + last_character)[1].trim()
    return(new_str)
    }

तार

my_string = 'and the thing that ! on the @ with the ^^ goes now' 

उपयोग :

get_between(my_string, 'that', 'now')

परिणाम :

"! on the @ with the ^^ goes

1

एक छोटा सा फ़ंक्शन जो मैंने बनाया, वह स्ट्रिंग को बीच में पकड़ सकता है, और (वैकल्पिक रूप से) एक विशिष्ट इंडेक्स को हथियाने के लिए कई मिलान किए गए शब्दों को छोड़ सकता है।

इसके अलावा, की स्थापना startकरने के लिए falseस्ट्रिंग की शुरुआत का उपयोग करेगा, और स्थापित करने endके लिए falseस्ट्रिंग के अंत का उपयोग करेगा।

pos1उस startपाठ की स्थिति पर सेट करें जिसका आप उपयोग करना चाहते हैं, 1की पहली घटना का उपयोग करेंगेstart

pos2के रूप में एक ही बात करता है pos1, लेकिन के लिए end, और 1की पहली आवृत्ति का उपयोग करेगा endके बाद ही start, की घटनाओं endसे पहले startध्यान नहीं दिया जाता।

function getStringBetween(str, start=false, end=false, pos1=1, pos2=1){
  var newPos1 = 0;
  var newPos2 = str.length;

  if(start){
    var loops = pos1;
    var i = 0;
    while(loops > 0){
      if(i > str.length){
        break;
      }else if(str[i] == start[0]){
        var found = 0;
        for(var p = 0; p < start.length; p++){
          if(str[i+p] == start[p]){
            found++;
          }
        }
        if(found >= start.length){
          newPos1 = i + start.length;
          loops--;
        }
      }
      i++;
    }
  }

  if(end){
    var loops = pos2;
    var i = newPos1;
    while(loops > 0){
      if(i > str.length){
        break;
      }else if(str[i] == end[0]){
        var found = 0;
        for(var p = 0; p < end.length; p++){
          if(str[i+p] == end[p]){
            found++;
          }
        }
        if(found >= end.length){
          newPos2 = i;
          loops--;
        }
      }
      i++;
    }
  }

  var result = '';
  for(var i = newPos1; i < newPos2; i++){
    result += str[i];
  }
  return result;
}

1

यह संभव समाधान हो सकता है

var str = 'RACK NO:Stock;PRODUCT TYPE:Stock Sale;PART N0:0035719061;INDEX NO:21A627 042;PART NAME:SPRING;';  
var newstr = str.split(':')[1].split(';')[0]; // return value as 'Stock'

console.log('stringvalue',newstr)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.