Javascript kullanarak iki karakter arasında alt dize alın


195

Nerede bir ':' ve ';' arasında her şeyi olsun daha büyük bir dize içinde bir dize ayıklamak çalışıyorum.

şimdiki

Str = 'MyLongString:StringIWant;'

Istenilen çıktı

newStr = 'StringIWant'

Yanıtlar:


426

Bunu deneyebilirsin

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

4
Önemsiz bir çözüm ama özellikle düzenli ifadelerden kaçınmak istiyorsanız kullanışlı.
Nikolay Frick

8
Herkes benim başlangıç ​​ve bitiş dizesi arasında bir alt dize her oluşumu için nasıl yapacağını biliyor mu?
MarksCode

6
@VirtualTroll 8 saniye? Holy cehennem "Çözümünüzü" görmek istiyorum: D
tom

@tom, bağlamsız "8 sn" anlamlı bir bilgi taşımasa da - ancak tek bir işlemin farkı olmadığından eminim)
ego

7
Eminim bu cevabın kendisinden 8 saniye önce gönderildiğini ifade eder. O yazarken.
MaxSantos

111

Bunu da deneyebilirsiniz:

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

13
Normal ifade yok. Sevdim.
flimflam57

str.split(':').pop().split(';')[0]kullanmaktan daha hızlı olabilir.shift()
MysteryPancake

48

kullanım split()

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

arrStrtarafından sınırlandırılan tüm dizeyi içerir :veya ;
So ile her dizeye erişirfor-loop

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

İstediğim dize [] ile bu çalışmıyor ... ex: 'MyLongString [StringIWant]'. Split (/ [[]] /);
Philippe

1
@Philippe Kullanım durumunuz için bu normal ifadeyi kullanın \[(.*?)\] ---> Kısacası [] normal ifadedeki karakter sınıfını gösterdiğinden köşeli parantezlerden kaçmanız gerekir.
asifsid88

33

@Babasaheb Gosavi Cevabı, alt dizelerden biri (":" ve ";") varsa mükemmeldir. ancak birden fazla tekrarlamanız olduğunda, biraz zor olabilir.


Birden fazla projede çalışmak için bulduğum en iyi çözüm, bir nesnenin içinde dört yöntem kullanmaktır.

  • İlk yöntem: aslında iki dize arasında bir alt dize elde etmektir (ancak yalnızca bir sonuç bulacaktır).
  • İkinci yöntem: en son bulunan sonucu alt dizelerle ondan önce ve sonra kaldıracaktır.
  • Üçüncü yöntem: yukarıdaki iki yöntemi bir dizede özyinelemeli olarak yapar.
  • Dördüncü yöntem: üçüncü yöntemi uygular ve sonucu döndürür.

kod

Yeterince konuşalım, kodu görelim:

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;
    }
};

Nasıl kullanılır?

Misal:

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]

Bir alınıyor RangeError: Maximum call stack size exceededistisna.
Alejandro Cotilla

1
Mükemmel cevap. tam da ihtiyacım olan buydu.
Andres Felipe

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

1
Amacı nedir; in [^;]
Jaakko Karhu

2
çeviri: "/" kalıbı başlatır. Bir ":" ifadesini "[]" ile "^;" art arda noktalı virgül değil "+" ve sonra bir ";" noktalı virgül ve "/" deseni sonlandırır.
GeliştiriciAğustos

15

Bu yöntemi seviyorum:

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

Bunu bir SharePoint 2013 Web Bölümünde test ettim ve gelecekte herkese yardımcı olursa harika çalıştı!
Shane Gib.

3
İstediğiniz dize "(" ve ")" arasındaysa bu çalışmayabilir
bravokeyl

4

@Tsds yolunu kullandım ama sadece split işlevini kullanarak.

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

Dikkat kelimesi: dizinin '1' dizinine erişen dizede ":" yoksa bir hata atar! str.split ( ':') [1]

bu nedenle belirsizlik varsa @tsds yolu daha güvenlidir

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

Bu 2 karakter arasındaki dizeler için mükemmel bir çözümdür
Phani Shashank

3

Çıkartıcınızın 'derlenmiş' sürümünü döndürmek için daha yüksek bir sipariş işlevi kullanabilirsiniz, böylece daha hızlı olur.

Normal ifadelerle ve normal kapanışta bir kez derlendiğinde Javascript'in maçı tüm eşleşmeleri döndürür.

Bu bizi sadece belirteçlerimiz olarak kullandığımız şeyleri (yani:) kaldırmak zorunda bırakıyor {{ve bunun için dilimle dize uzunluğunu kullanabiliriz.

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);
    }
}

Bir kez derleyin ve birden çok kez kullanın ...

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

Veya tek seferlik kullanım ...

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

Ayrıca Javascript'in replaceişlevine bakın, ancak değiştirme argümanı için bir işlev kullanarak (örneğin bir mini şablon motoru (dize enterpolasyonu) yapıyorsanız bunu yapardınız ... lodash.get, istediğiniz değerleri almak için de yardımcı olabilir. ile değiştirin ? ...

Cevabım çok uzun ama birisine yardım edebilir!


2

Bunu da kullanabilirsiniz ...

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

İki alt dize arasında dize alın (1'den fazla karakter içerir)

function substrInBetween(whole_str, str1, str2){
   if (whole_str.indexOf(str1) === -1 || whole_str.indexOf(str2) === -1) {
       return undefined; // or ""
  }
  strlength1 = str1.length;
  return whole_str.substring(
                whole_str.indexOf(str1) + strlength1, 
                whole_str.indexOf(str2)
               );

   }

Not Bunun indexOf()yerine lastIndexOf()bu dizelerin ilk oluşumlarını kontrol edecek şekilde kullanıyorum


Güzel ve çok okunabilir fonksiyon. Fakat strlength1değişkenin amacı nedir? Değer, satır içi olarak kullanılmalıdır. Ayrıca hangi vaka stilini kullandığınız da belli değil . strlength1- stil yok, whole_str- yılan çantası.
Boris


1

JQuery kullanma :

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

sicim

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

kullanım :

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

sonuç :

"! on the @ with the ^^ goes

1

Küçük bir işlev arasında dizeyi tutabilir ve (isteğe bağlı olarak) belirli bir dizin kapmak için eşleşen birkaç kelime atlayabilirsiniz.

Ayrıca, ayar startiçin falsedizenin başlangıcını kullanacak ve ayar endiçin falsedize sonuna kullanacaktır.

kullanmak istediğiniz metnin pos1konumuna ayarlandığında ,start1start

pos2aynı şeyi yapar pos1, ama için endve 1ilk geçtiği kullanacak endsonra start, sık geçtiğine endönce startgöz ardı edilir.

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

Bu olası bir çözüm olabilir

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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.