否定集中的字符-不被两个特定字符包围时排除

时间:2019-07-09 06:03:11

标签: javascript regex

假设我有以下字符串:

"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 个答案:

答案 0 :(得分:1)

最后一种索引方法

这是不使用正则表达式的解决方案。可能适合您的情况,因为您的逻辑是找到字符串出现的最后一个索引并在此之后删除所有内容。

// 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, [' - ', ' | ']));

正则表达式方法

如果您希望在最后一次出现字符串后使用正则表达式匹配所有内容,则可以使用以下正则表达式:/\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)(.*)/, ''));