从第一个括号替换('content')的所有出现 - (到最后)?

时间:2016-11-07 15:37:37

标签: javascript jquery regex

我有一个字符串,可能是:Hello (hiii(1998 overhill) hpp) there。 我想剥离从内部删除括号和内容,但保留单词Hello there

以下是我的代码,但它删除了第一部分:(hiii(1998 overhill)抛弃了hpp)

myString = "Hello (hiii(1998 overhill) hpp) there";
myString = myString.replace(/ \([^)]*\)/g, '');

话虽如此,我希望它能为所有事件做到这一点,这就是为什么我提供/g但我如何为最后一次出现(内容)hi)呢?供将来参考。

所以,如果我有"Hello (ddd(dog) kk) and hello (pineapple(g)",是否可以删除最后一个括号,以便我离开:Hello (ddd(dog) kk) and hello删除(pineapple(g)

谢谢!

5 个答案:

答案 0 :(得分:1)

使用简单的正则表达式可能不适合处理嵌套结构。尝试递归或正则表达式递归,如this similar question的两个第一个答案所示。

答案 1 :(得分:1)

只需将字符串拆分为基于空格的数组,并在零位置和最后位置添加元素:

myString = myString.split(" ");
var result = myString[0] + " " + myString[myString.length-1];

答案 2 :(得分:1)

这是一个非正则表达式的代码版本,可用于给出的所有示例:

var newStr = str.split(' ').map(function(sec) {
    if (sec[0] !== '(' && sec[sec.length-1] !== ')' ) {
    return sec
  }
}).join(' ').replace(/\s\s+/g, ' ')

但是,如果原始字符串中有空格包围的单词,则无效。这意味着对于字符串:Hello (hiii(1998 Teddybear overhill) hpp) there它将返回Hello Teddybear there

由于您未指定,因此代码将处理所有提供的案例。

答案 3 :(得分:1)

我不确定我是否正确理解了这个问题,但如果支架数量不均匀,您似乎也希望删除括号内的所有内容。这可能是一种矫枉过正,但这是我的尝试

JSbin example

myString = "Hello (hiii(1998 overhill) hpp) there";

function noBraces(str){

  let arr = str.split('')
      openBrace = null,
      closeBrace = null;

  // find first opening brace
  for (let i = 0, l = arr.length; i < l; i++){
    if (arr[i] == "(" ) {
      openBrace = i;
      break
    }
  }

  // find last closing brace
  for (let i = 0, l = arr.length - 1; i <= l; l--){  
    if (arr[l] == ")") {
      // we don't need the brace in the result
      closeBrace = l + 1;
      break
    }
  }

  // check if both braces exist and return result
  if (openBrace != null && closeBrace != null){
    return str.slice(0,openBrace) + str.slice(closeBrace, str.length);
  }
  // if only one brace exists then return everything
  // on one side of the brace
  else if (openBrace != null && closeBrace == null){
    return str.slice(0,openBrace);
  } else if (openBrace == null && closeBrace != null){
    return str.slice(closeBrace,str.length);
  } else {
    // if no braces found return the string
    return str;
  }

}

console.log(noBraces(myString));

答案 4 :(得分:1)

我找到了两种可能的情况。

其中一个是我在评论中告诉你的那个:

var myString = 'Hello (ddd(dog) kk) and hello (pineapple(g)';
console.log(myString.replace(/\(.+\)/g, ''));

这个会从第一个(移到最后一个)

或者递归删除括号内容对:

function removeBracketsContents(str) {
  while (str.indexOf('(') > -1 & str.indexOf(')') > -1) {
    str = str.replace(/\([^\(\)]+\)/g, '');
  }
  return str;
}

console.log(removeBracketsContents('Hello (hiii(1998 overhill) hpp) there'));
console.log(removeBracketsContents('Hello (ddd(dog) kk) and hello (pineapple(g))'));