Obtenir une sous-chaîne entre deux caractères en utilisant javascript


196

J'essaie d'extraire une chaîne à partir d'une chaîne plus grande où il obtient tout entre un ':' et un ';'.

Actuel

Str = 'MyLongString:StringIWant;'

Sortie désirée

newStr = 'StringIWant'

Réponses:


428

Tu peux essayer ça

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

4
Solution triviale mais pratique surtout si vous souhaitez éviter les expressions régulières.
Nikolay Frick

8
Est-ce que quelqu'un sait comment je ferais cela pour chaque occurrence d'une sous-chaîne entre ma chaîne de début et de fin?
MarksCode

6
@VirtualTroll 8 sec? Putain de merde je veux voir ta "solution": D
tom

@tom bien que "8 sec" sans contexte ne porte aucune information significative - mais je suis presque sûr que ce n'est pas une différence d'une seule course)
ego

7
Je suis sûr qu'il veut dire que cette réponse a été postée 8 secondes avant la sienne. Pendant qu'il l'écrivait.
MaxSantos

111

Vous pouvez également essayer ceci:

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

13
Pas de regex. Aimer.
flimflam57

str.split(':').pop().split(';')[0]peut être plus rapide que d'utiliser.shift()
MysteryPancake

48

Utilisation split()

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

arrStrcontiendra toute la chaîne délimitée par :ou ;
Alors accédez à chaque chaîne viafor-loop

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

La chaîne que je veux est entre [] et cela ne fonctionne pas ... ex: 'MyLongString [StringIWant]'. Split (/ [[]] /);
Philippe

1
@Philippe Pour votre cas d'utilisation, utilisez ce regex \[(.*?)\] ---> En bref, vous devez échapper les crochets, car [] désigne la classe de caractères dans l'expression régulière.
asifsid88

33

@Babasaheb Gosavi Answer est parfait si vous avez une occurrence des sous-chaînes (":" et ";"). mais une fois que vous avez plusieurs occurrences, cela peut devenir un peu délicat.


La meilleure solution que j'ai trouvée pour travailler sur plusieurs projets consiste à utiliser quatre méthodes à l'intérieur d'un objet.

  • Première méthode: consiste à obtenir une sous-chaîne entre deux chaînes (cependant, il ne trouvera qu'un seul résultat).
  • Deuxième méthode: supprimera le résultat (potentiel) le plus récemment trouvé avec les sous-chaînes après et avant.
  • Troisième méthode: fera les deux méthodes ci-dessus de manière récursive sur une chaîne.
  • Quatrième méthode: appliquera la troisième méthode et retournera le résultat.

Code

Alors assez parlé, voyons le code:

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

Comment utiliser?

Exemple:

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]

Obtenir une RangeError: Maximum call stack size exceededexception.
Alejandro Cotilla

1
Très bonne réponse. c'était exactement ce dont j'avais besoin.
Andres Felipe

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

1
Quel est le but de; dans [^;]
Jaakko Karhu

2
la traduction est: "/" démarre le motif. Faites correspondre un ":" avec "[]" n'importe quoi de "^;" pas de point-virgule "+" à plusieurs reprises, puis recherchez un ";" le point-virgule et "/" terminent le motif.
DeveloperWeeks

15

J'aime cette méthode:

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

J'ai testé cela dans un Webpart SharePoint 2013 et j'ai très bien fonctionné si cela aide quelqu'un à l'avenir!
Shane Gib.

3
Cela peut ne pas fonctionner si la chaîne que vous voulez est entre "(" et ")"
bravokeyl

4

J'ai utilisé @tsds façon mais en utilisant uniquement la fonction de fractionnement.

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

avertissement: s'il n'y a pas de ":" dans la chaîne, l'accès à l'index '1' du tableau générera une erreur! str.split (':') [1]

donc @tsds way est plus sûr s'il y a incertitude

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

C'est une excellente solution pour les chaînes entre 2 caractères
Phani Shashank

3

Vous pouvez utiliser une fonction d'ordre supérieur pour renvoyer une version «compilée» de votre extracteur, de cette façon c'est plus rapide.

Avec les expressions régulières, et en compilant l'expression régulière une fois dans une fermeture, la correspondance de Javascript renverra toutes les correspondances.

Cela ne nous laisse plus qu'à supprimer ce que nous avons utilisé comme marqueurs (c'est-à-dire:) {{et nous pouvons utiliser la longueur de chaîne pour cela avec 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);
    }
}

Compilez une fois et utilisez plusieurs fois ...

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

Ou à usage unique ...

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

Regardez également la replacefonction de Javascript mais en utilisant une fonction pour l'argument de remplacement (vous le feriez si, par exemple, vous faisiez un mini moteur de modèle (interpolation de chaîne) ... lodash.get pourrait également être utile pour obtenir les valeurs que vous souhaitez remplacer par ? ...

Ma réponse est trop longue mais cela pourrait aider quelqu'un!


2

Vous pouvez également utiliser celui-ci ...

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

Récupère une chaîne entre deux sous-chaînes (contient plus d'un caractère)

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

   }

Notez que j'utilise à la indexOf()place de lastIndexOf()donc il vérifiera les premières occurrences de ces chaînes


Fonction agréable et très lisible. Mais quel est le but de la strlength1variable? La valeur doit être utilisée en ligne à la place. De plus, le style de boîtier que vous utilisez n'est pas clair . strlength1- pas de style, whole_str- étui serpent.
Boris le


1

Utilisation de jQuery :

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

chaîne

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

utilisation :

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

résultat :

"! on the @ with the ^^ goes

1

Une petite fonction que j'ai créée qui peut saisir la chaîne entre et peut (éventuellement) sauter un certain nombre de mots correspondants pour saisir un index spécifique.

En outre, définir startsur falseutilisera le début de la chaîne et définir endsur falseutilisera la fin de la chaîne.

défini pos1sur la position du starttexte que vous souhaitez utiliser, 1utilisera la première occurrence destart

pos2fait la même chose que pos1, mais pour end, et 1utilisera la première occurrence de endseulement après start, les occurrences d' endavant startsont ignorées.

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

Cela pourrait être la solution possible

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)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.