Javascript: Найти каждый экземпляр строки между двумя строками - PullRequest
0 голосов
/ 12 марта 2020

У меня есть строка, которая содержит слово, заключенное в @ - и - @, например так: эта @ -book- @ создана автором @ -gameauthor-@.

Мне нужна функция, которая найдет все экземпляры слов между этим корпусом и вернуть его. Это хорошо работает, если в нем есть только одно слово. Но если есть два слова, он вернет все между первым @ - и последним -@. Так что вместо возврата book и gameauthor он возвращает: -book- @ создан автором @ -gameauthor-

Я написал эту функцию и код, как я могу ее улучшить:

function findBetween(text, firststring, secondstring) {


    //Function to text between two strings.
    var firstvariable = firststring;
    var secondvariable = secondstring;
    var text = text;

    var regExString = new RegExp("(?:" + firstvariable + ")((.[\s\S]*))(?:" + secondvariable + ")", "g"); 

    var strResult = regExString.exec(text);
if (strResult != null) {
    return strResult[1];
    }
}

var str = "This @-book-@ is created by author @-gameauthor-@.";

var test = findBetween(str, "@-", "-@");

alert(test);

РЕДАКТИРОВАТЬ: Вот обновленный код с использованием решения ниже:

function replaceAll(str, find, replace) {
  return str.replace(new RegExp(find, 'g'), replace);
}   

var book = "Moby Dick";
var gameauthor = "Joey DiPerla";

var str = "This @-book-@ is created by author @-gameauthor-@.";

var myArray = str.split("@");

var len = myArray.length;

for(let i = len-1;i>=0;i--){  
   myArray[i] = myArray[i].replace(/-/g, '');
   if(i%2 == 0) {
       myArray.splice(i,1)

    if ( myArray[i] !== undefined) {

        var find = "@-" + myArray[i] + "-@";
        var replace = eval(myArray[i]);

        str = replaceAll(str, find, replace);
    }

   }
}

alert(str);

Ответы [ 2 ]

0 голосов
/ 12 марта 2020

Хотя вам не нужно экранировать \ в литералах RegExp, вам нужно \\ в строках RegExp ... но это только часть вашей проблемы:

function findBetween(str, start, end = null){
  let s = start, e = end;
  if(e === null)e = s;
  const x = new RegExp(s+'[^'+e+']+'+e, 'g'), m = str.match(x), r = new RegExp('^'+s+'|'+e+'$', 'g');
  return m.map(s=>s.replace(r, ''));
}
console.log(findBetween('This @-book-@ is created by author @-gameauthor-@.', '@-', '-@'));
0 голосов
/ 12 марта 2020

вы хотите использовать функцию split, чтобы разбить строку на массив строк и затем удалить '-'. Наконец, удалите ненужные элементы с помощью соединения.

var str = "This @-book-@ is created by author @-gameauthor-@.";

var myArray = str.split("@");

var len = myArray.length;

for(let i = len-1;i>=0;i--){  
   myArray[i] = myArray[i].replace(/-/g, '');
   if(i%2 == 0) myArray.splice(i,1);
}

console.log(myArray)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...