Dapatkan Substring antara dua karakter menggunakan javascript


196

Saya mencoba untuk mengekstraksi string dari dalam string yang lebih besar di mana ia mendapatkan segalanya di antara a ':' dan a ';'.

Arus

Str = 'MyLongString:StringIWant;'

Output yang Diinginkan

newStr = 'StringIWant'

Jawaban:


428

Anda bisa mencoba ini

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

4
Solusi sepele tetapi berguna terutama jika Anda ingin menghindari ekspresi reguler.
Nikolay Frick

8
Adakah yang tahu bagaimana saya akan melakukan ini untuk setiap kemunculan substring antara string awal dan akhir saya?
MarksCode

6
@VirtualTroll 8 detik? Sial, saya ingin melihat "solusi" Anda: D
tom

@tom meskipun "8 detik" tanpa konteks tidak mengandung informasi yang berarti - tapi saya cukup yakin itu bukan perbedaan dari sekali jalan)
ego

7
Saya yakin maksudnya jawaban ini diposting 8 detik sebelum jawaban. Sementara dia menulisnya.
MaxSantos

111

Anda juga dapat mencoba ini:

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

13
Tidak ada regex. Suka.
flimflam57

str.split(':').pop().split(';')[0]mungkin lebih cepat daripada menggunakan.shift()
MysteryPancake

48

Menggunakan split()

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

arrStrakan berisi semua string yang dibatasi oleh :atau ;
Jadi akses setiap string melaluifor-loop

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

String yang saya inginkan adalah antara [] dan ini tidak berfungsi ... ex: 'MyLongString [StringIWant]'. Split (/ [[]] /);
Philippe

1
@Philippe Untuk case-use Anda, gunakan regex ini \[(.*?)\] ---> Singkatnya Anda harus keluar dari tanda kurung siku, karena [] menunjukkan kelas karakter dalam regex.
asifsid88

33

@Babasaheb Gosavi Jawaban sempurna jika Anda memiliki satu kemunculan substring (":" dan ";"). tetapi begitu Anda memiliki beberapa kejadian, itu mungkin akan sedikit rumit.


Solusi terbaik yang saya buat untuk bekerja pada banyak proyek adalah menggunakan empat metode di dalam suatu objek.

  • Metode pertama: adalah benar-benar mendapatkan substring dari antara dua string (namun hanya akan menemukan satu hasil).
  • Metode kedua: akan menghapus (calon) hasil yang terakhir ditemukan dengan substring setelah dan sebelum itu.
  • Metode ketiga: akan melakukan dua metode di atas secara rekursif pada sebuah string.
  • Metode keempat: akan menerapkan metode ketiga dan mengembalikan hasilnya.

Kode

Jadi cukup berbicara, mari kita lihat kodenya:

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

Cara Penggunaan?

Contoh:

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]

Mendapatkan RangeError: Maximum call stack size exceededpengecualian.
Alejandro Cotilla

1
Jawaban yang bagus inilah yang saya butuhkan.
Andres Felipe

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

1
Apa tujuan dari; di [^;]
Jaakko Karhu

2
terjemahannya adalah: "/" mulai polanya. Cocokkan ":" dengan "[]" apa pun dari "^;" tidak semi-kolon "+" berulang kali dan kemudian menemukan ";" semi-colon dan "/" mengakhiri polanya.
DeveloperWeeks

15

Saya suka metode ini:

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

Saya menguji ini di SharePoint 2013 Webpart dan bekerja dengan baik jika itu membantu siapa pun di masa depan!
Shane Gib.

3
Ini mungkin tidak berfungsi jika string yang Anda inginkan berada di antara "(" dan ")"
bravokeyl

4

Saya menggunakan cara @tsds tetapi dengan hanya menggunakan fungsi split.

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

kata hati-hati: jika tidak ada ":" dalam string mengakses indeks '1' dari array akan menimbulkan kesalahan! str.split (':') [1]

Oleh karena itu cara @tsds lebih aman jika ada ketidakpastian

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

Ini adalah solusi terbaik untuk string antara 2 karakter
Phani Shashank

3

Anda dapat menggunakan fungsi urutan yang lebih tinggi untuk mengembalikan versi 'kompilasi' ekstraktor Anda, dengan cara itu lebih cepat.

Dengan regex, dan kompilasi regex sekali dalam penutupan, pertandingan Javascript akan mengembalikan semua pertandingan.

Ini membuat kita hanya perlu menghapus apa yang kita gunakan sebagai spidol kita (yaitu:) {{dan kita bisa menggunakan panjang string untuk ini dengan slice.

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

Kompilasi sekali dan gunakan beberapa kali ...

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

Atau sekali pakai ...

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

Juga lihat replacefungsi Javascript tetapi menggunakan fungsi untuk argumen penggantian (Anda akan melakukannya jika misalnya Anda melakukan mesin templat mini (interpolasi string) ... lodash.get juga bisa membantu kemudian untuk mendapatkan nilai yang Anda inginkan ubah dengan ? ...

Jawaban saya terlalu panjang tetapi mungkin bisa membantu seseorang!


2

Anda juga dapat menggunakan ini ...

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

Dapatkan string di antara dua substring (berisi lebih dari 1 karakter)

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

   }

Catatan saya menggunakan indexOf()bukan lastIndexOf()jadi itu akan memeriksa untuk kemunculan pertama dari string tersebut


Fungsi bagus dan sangat mudah dibaca. Tapi apa tujuan dari strlength1variabel? Nilai harus digunakan sebaris sebagai gantinya. Juga tidak jelas gaya huruf apa yang Anda gunakan. strlength1- tidak ada gaya, whole_str- kasing ular.
Boris


1

Menggunakan jQuery :

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

tali

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

penggunaan :

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

hasil :

"! on the @ with the ^^ goes

1

Sebuah fungsi kecil yang saya buat yang dapat mengambil string di antara, dan dapat (opsional) melewatkan sejumlah kata yang cocok untuk mengambil indeks tertentu.

Selain itu, pengaturan startuntuk falseakan menggunakan awal string, dan pengaturan enduntuk falseakan menggunakan akhir string.

diatur pos1ke posisi startteks yang ingin Anda gunakan, 1akan menggunakan kejadian pertamastart

pos2melakukan hal yang sama seperti pos1, tetapi untuk end, dan 1akan menggunakan kejadian pertama endhanya setelah start, kejadian endsebelumnya startdiabaikan.

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

Ini bisa menjadi solusi yang mungkin

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)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.