当前位置: 首页 > 知识库问答 >
问题:

javascript - 找出括号中的所有内容,有什么更好的写法吗?

虞华彩
2023-09-26
const str = 'a+b*(d-e)*c+(((b+a)+f)+g)'let current = 0, res = [];function test() {    let letter = str[current];      if (letter === '(') {        if(str[++current] === "("){            letter = str[current]        } else {            letter = '';          }          while (current <str.length && str[current] !== ')') {            if(str[current] === '('){                letter += test();            }            letter += str[current];            current++;           }        res.push(letter);        return letter    }    current++ }while(current <str.length){  test()}console.log(res)

共有5个答案

冀俊良
2023-09-26
function findParenthesesContent (str) {    let doList = [];    let doneList = [];        for (let i = 0; i < str.length; i++) {        let d = str[i];        if (d === ')') {           let o = doList.pop();           o && doneList.push(o);        }         doList = doList.map(k => k + d);        if (d === '(') {           doList.push('');        }          }    return doneList;}window.console.log(findParenthesesContent('a+b*(d-e)*c+(((b+a)+f)+g)')); 
宇文念
2023-09-26

不考虑效率的话,可以把最小单位的(x+y)给依次替换为/1、/2..../n,然后逐一恢复;

const str = 'a+b*(d-e)*c+(((b+a)+f)+g)';const getExpressions = (str) => {  const recover = (item) => {    [tmp, index] = item.match(/\/(\d+)/) || [];    return item = tmp ? recover(item.replace(tmp, ans[index])) : item;  }  const reg = /\([^\(\)]+\)/;  let ans = [];  let index = 0;  while (match = str.match(reg)) {    ans.push(match[0]);    str = str.replace(match[0], `/${index++}`);  }  console.log(ans); // ['(d-e)', '(b+a)', '(/1+f)', '(/2+g)']  return ans.map(item => recover(item));}console.log(getExpressions(str)); // ['(d-e)', '(b+a)', '((b+a)+f)', '(((b+a)+f)+g)']

希望帮助到你;

解念
2023-09-26
a = 'a+b*(d-e)*c+(((b+a)+f)+g)'r = /\([^)]+/result = [];temp = [];time = 0;do {    // RegExp 过滤()    time += 1    temp = r.exec(a);    if(temp){        a = a.slice(temp.index + temp[0].length);        let len = temp[0].split(/\(/).length - 1;        // 单层正常的正常输出        if(len === 1){            a = a.slice(1);            result.push(temp[0] + ')');            console.log(result, len)        // 多层的取前X层        }else{            let text = a.split(')').slice(len - 2).join(')');            a = a.slice(text.length);            result.push(temp[0] + ')' + text);            console.log(result, len)        }            }} while (time < 10 && temp)// 输出 result = ['(d-e)', '(((b+a)+f)+g)'] 
冯奇思
2023-09-26
function extractSubExpressions(str: string): string[] {  const stack: number[] = [];  const subExpressions: string[] = [];  for (let i = 0; i < str.length; i++) {    if (str[i] === "(") {      stack.push(i);    } else if (str[i] === ")") {      if (stack.length === 0) {        throw new Error("Invalid expression: Incorrect bracket placement");      }      const startIndex = stack.pop()!;      const subExpression = str.substring(startIndex, i + 1);      const replaceStr = subExpression.substr(1,subExpression.length-2)      subExpressions.push(replaceStr);    }  }  if (stack.length !== 0) {    throw new Error("Invalid expression: Unclosed brackets");  }  return subExpressions;}const str = 'a+b*(d-e)*c+(((b+a)+f)+g)';const result = extractSubExpressions(str);console.log(result); // ['d-e', 'b+a', '(b+a)+f', '((b+a)+f)+g']
訾俊名
2023-09-26

这段代码看起来是在试图解析并找出字符串中的所有括号内容。不过,这段代码并不完全正确,因为它没有正确处理嵌套括号的情况。例如,在字符串 '(((a+b)+c)+(d+e))' 中,它只能正确处理到 'a+b'+c 这部分,然后就无法继续处理了,因为它遇到了嵌套的括号 (d+e)

如果你想要找出括号中的所有内容,一个更好的方法是使用递归下降解析或者正则表达式。不过,正则表达式可能对处理复杂的数学表达式有困难,所以我们可以使用递归下降解析。

下面是一个使用 JavaScript 的递归下降解析的例子,用于找出字符串中括号内的内容:

const str = 'a+b*(d-e)*c+(((b+a)+f)+g)';const mathExpression = /[\+\-*\/(\d\s\+\s\d)()]/g;let result = [];let temp;while ((temp = mathExpression.exec(str)) !== null) {    let start = temp.index;    let end = start + temp[0].length;    let content = str.slice(start, end);    result.push(content);    str = str.slice(0, start) + str.slice(end);}console.log(result);

这个代码段将会找出所有括号和括号内的内容。它通过正则表达式 [\+\-*\/(\d\s\+\s\d)()] 找到所有包含加、减、乘、除运算以及括号的字符组合,然后通过 String.prototype.slice() 方法来截取出每一个括号及其内容,然后将它们添加到结果数组中。

 类似资料:
  • 有时,项目中的许多广为流传的惯例和协定变得非常重要,你需要记录下来。为了保证这种文档的正统性,要清楚的表明这些内容基于邮件列表的讨论,并已经形成协定开始生效。随着你的编写,应当引用邮件列表归档中的相关讨论,对于任何不能确定的要点,要重新询问并确认。文档中不应当包含任何出其不意的东西:它不应当是协议的来源,而只是对于协议的描述。当然,如果它足够成功,人们会开始引用它来作为自己权利的来源,但是这只是说

  • 我试图在外类声明的括号(泛型)中插入一个私有类,并得到下一个错误:“com.example.gridrecyclerview.RecycleViewAdapter。VieHolder在com.example.gridrecyclerview.RecyclViewAdapter中有私有访问权限” 将内部类更改为公共类时,一切正常。谁能给我解释一下这个问题吗。附件代码:

  • 这里我理解哈希(#)符号将定义为本地模板变量,但是前面的星号是什么意思呢?还有,有必要吗? 下面是使用括号的示例: 我有点理解周围的括号将它绑定到HTML属性/Angular指令。这是否意味着它们是Angular计算表达式的指针?就像是Angular 1中的的等价物? 我猜真正的问题是,这些符号在Angular 2中有特殊的含义吗,知道何时使用每一个的最简单的方法是什么?谢谢!!

  • 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 注意空字符串可被认为是有效字符串。 示例 1: 输入: "()" 输出: true 示例 2: 输入: "()[]{}" 输出: true 示例 3: 输入: "(]" 输出: false 示例 4: 输入: "([)

  • 结果必须是:匹配0=6207匹配1=6204... 希望你能帮助我,谢谢。

  • 问题内容: 我正在学习JavaScript,并且在浏览jQuery库时发现(冒号)被大量使用。这在JavaScript中有什么用? 问题答案: 在功能上等同于