Получить группы между двумя строками - PullRequest
0 голосов
/ 06 января 2019

Итак, я получил строку:

let string = "XABXAX12345BX293993AX9393B33AXAXBXBXBXAAABBX";

и я хотел бы извлечь все вхождения между строками AX и BX s, чтобы получить такой массив как результат:

let result = ["12345", "9393B33AXAX"];

Я пытался использовать какое-то регулярное выражение, но на самом деле мне это не удалось.

let result = string.split(/AX([^AXBX]+)BX/);

Другим подходом был простой цикл for, но он также не работает, как я ожидал. Так что, возможно, кто-нибудь сможет помочь мне решить проблемы. Пожалуйста, посмотрите на мой код:

let string = "XABXAX12345BX293993AX9393B33AXAXBXBXBXAAABBX"

let result = [];
for (let i=0; i<string.length; i++) {
  if (string[i] == "A" && string[i+1] === "X") {
    for (let j=i; j<string.length; j++) {
      if (string[j] == "B" && string[j+1] === "X") {
        let substring = string.substring(i+1, j+1);
        result.push(substring)
        break;
      }
    }
  }
}

console.log(result);

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Вот относительно простой циклический подход, в котором не используются регулярные выражения:

function findOccurrences(str, fromStr, toStr) {
  const occurrences = [];
  let startIndex = 0;
  
  while (true) {
    const fromIndex = str.indexOf(fromStr, startIndex);
    if (fromIndex === -1) {
      break;
    }

    const toIndex = str.indexOf(toStr, fromIndex + fromStr.length);
    if (toIndex === -1) {
      break;
    }

    const occurrence = str.slice(fromIndex + fromStr.length, toIndex);
    occurrences.push(occurrence);
    startIndex = toIndex + toStr.length;
  }

  return occurrences;
}

console.log(
  findOccurrences("XABXAX12345BX293993AX9393B33AXAXBXBXBXAAABBX",
    "AX", "BX"));

Сюда не входят проверки работоспособности; например, вы можете проверить, что fromStr и toStr не являются пустыми строками.

0 голосов
/ 07 января 2019

Вот простое решение:

function re_esc(str) {
    return str.replace(/\W/g, "\\$&");
}

const start = "AX";
const end = "BX";

const re = new RegExp(re_esc(start) + '([\\s\\S]*?)' + re_esc(end), 'g');

const string = "XABXAX12345BX293993AX9393B33AXAXBXBXBXAAABBX";
const results = [];

let m;
while (m = re.exec(string)) {
    results.push(m[1]);
}

console.log(results);

Мы строим регулярное выражение в форме START(.*?)END, а затем используем его для последовательного извлечения совпадений в цикле.

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