Получить подстроку между двумя символами, используя javascript

Я пытаюсь извлечь строку из более крупной строки, где она получает все между ними: 'и'.

Current

Str = 'MyLongString:StringIWant;'

Желаемый выход

newStr = 'StringIWant'

Ответ 1

Вы можете попробовать это

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

Ответ 2

Вы также можете попробовать это:

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

Ответ 3

Используйте 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]);

Ответ 4

@Babasaheb Gosavi Answer is perfect, если у вас есть одно появление подстрок ( ":" и ";" ). но как только у вас будет несколько случаев, это может немного запутаться.


Лучшее решение, которое я разработал для работы над несколькими проектами, - это использование четырех методов внутри объекта.

  • Первый метод: - фактически получить подстроку из двух строк (однако он найдет только один результат).
  • Второй метод: удалит (будущий) последний найденный результат с подстроками после и до него.
  • Третий метод: будет выполнять эти два метода рекурсивно по строке.
  • Четвертый метод: применит третий метод и вернет результат.

код

Достаточно говорить, посмотрим код:

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 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]

Ответ 5

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

Ответ 6

Мне нравится этот метод:

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

Ответ 7

Я использовал @tsds, но только с помощью функции split.

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

Предупреждение: если в строке, обращающейся к индексу массива '1', нет ":", будет выдано сообщение об ошибке! str.split( ':') [1]

поэтому путь @tsds безопаснее, если есть неопределенность

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

Ответ 8

Вы также можете использовать этот...

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 @[email protected] 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>

Ответ 9

Используя 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

Ответ 11

Небольшая функция, которую я сделал, которая может захватить строку между и может (опционально) пропустить несколько подходящих слов, чтобы получить определенный индекс.

Кроме того, установка 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;
}

Ответ 12

Это может быть возможным решением

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)

Ответ 13

получить строку между подстроками (содержит более 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(), так что он проверит первые появления этих строк

Ответ 14

Вы можете использовать функцию более высокого порядка, чтобы вернуть "скомпилированную" версию вашего экстрактора, чтобы это было быстрее.

С регулярными выражениями и компиляцией регулярного выражения один раз в замыкании совпадение Javascript вернет все совпадения.

Это оставляет нам только необходимость удалить то, что мы использовали в качестве наших маркеров (то есть: {{), и мы можем использовать длину строки для этого со слайсом.

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' ]

Также посмотрите на функцию Javascript replace, но используйте функцию для аргумента замены (вы могли бы сделать это, если, например, вы выполняете мини-шаблонизатор (интерполяция строк)... lodash.get также может быть полезен для получить значения, которые вы хотите заменить?...

Мой ответ слишком длинный, но он может кому-то помочь!