Символ в отрицательном наборе - исключать, если он не окружен двумя конкретными символами - PullRequest
0 голосов
/ 09 июля 2019

Предполагая, что у меня есть следующая строка:

"test | test - string-test | test - it is some string"

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

Итак, у меня есть такое регулярное выражение до сих пор:

/ [-|] [^-|]+$/

и при использовании в replace метод получил это, как и ожидалось:

"test | test - string-test | test"

Но происходит сбой, когда строка выглядит примерно так:

"test | test - string-test | test - it is some-string"

Я хочу "test | test - string-test | test", но получаю "test | test - string-test | test - it is some-string".

Как добиться ожидаемого результата, как описано выше с регулярным выражением?

Рабочий фрагмент:

const string1 = "test | test - string-test | test - it is some string";
const string2 = "test | test - string-test | test - it is some-string"

const regex = / [-|] [^-|]+$/

const result1 = string1.replace(regex, '');
const result2 = string2.replace(regex, '');

console.log(result1);
console.log(result2);

1 Ответ

1 голос
/ 09 июля 2019

Последний подход индекса

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

// Option extend String.prototype
String.prototype.theLastIndexOf = function () {

  var theLastIndex = -1;
  
  for (var i = 0; i < arguments.length; i++) {
    var idx = this.lastIndexOf(arguments[i]);
    if (idx > theLastIndex) {
      theLastIndex = idx;
    }
  }
  
  return theLastIndex;
}

// Option stand alone function
function _trimAfter(str, sought){
  var theLastIndex = -1;
  
  for (var i = 0; i < sought.length; i++) {
    var idx = str.lastIndexOf(sought[i]);
    if (idx > theLastIndex) {
      theLastIndex = idx;
    }
  }
  
  return theLastIndex >= 0 ? str.substr(0, theLastIndex) : str;
}

var str1 = 'test | test - string-test | test - it is some-string';
var str2 = 'test | test - string-test - test | it is some-string';
console.log('Before: ' + str1)
console.log(' After: ' + str1.substr(0, str1.theLastIndexOf(' - ', ' | ')));
console.log('Before: ' + str2)
console.log(' After: ' + _trimAfter(str2, [' - ', ' | ']));

Подход Regex

Если вы хотите сопоставить все после последнего вхождения строки с регулярным выражением, вы можете использовать это регулярное выражение: /\s[-|]\s(?!.*\s[-|]\s)(.*)/, где значения в контексте этого регулярного выражения:

  • \s[-|]\s среднее совпадение - или |
  • (?!.*\s[-|]\s) означает, что не следуют - или |
  • (.*) означает соответствие всему после двух вышеуказанных условий

var str1 = 'test | test - string-test - test | it is - some-string';
var str2 = 'test | test - string-test - test | it is some-string';

console.log('Before: ' + str1);
console.log(' After: ' + str1.replace(/\s[-|]\s(?!.*\s[-|]\s)(.*)/, ''));

console.log('Before: ' + str2);
console.log(' After: ' + str2.replace(/\s[-|]\s(?!.*\s[-|]\s)(.*)/, ''));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...