匹配不遵循模式中的串行排列的正则表达式模式

问题描述 投票:0回答:1

如何将字符串与 javascript 中的正则表达式模式匹配,但字符串不必遵循正则表达式模式中的串行排列。 针对包含括号的字符串进行正则表达式模式测试,条件为:

  • 左括号必须用相同类型的括号封闭。
  • 左括号必须按正确的顺序闭合。
  • 每个右括号都有一个对应的相同类型的左括号。

这是我尝试过的;

const pattern = /^(\(\))*(\{\})*(\[\])*$/

如果我针对这些字符串进行测试,它工作正常

console.log(pattern.test("(){}[]")) //returns true
console.log(pattern.test("(]") //returns false

但是如果更改括号在正则表达式中出现的顺序,那么我会得到错误

console.log(pattern.test("{}()[]") // returns false

我希望括号串能够匹配模式,无论哪个括号在前或在后,只要满足上述条件即可

javascript regex
1个回答
0
投票

让我们编写一个解析器! 好吧,因为我们关心的只是括号,所以我们可以在从左到右读取时使用堆栈数据结构,并在读取过程中推入和弹出。

var exp1 = "(){(inner)[]}[]"
var exp2 = "(]"

console.log(checkParenthesis(exp1))
console.log(checkParenthesis(exp2))

function checkParenthesis(str) {
  var stack = []
  for (const char of str) {
    if (isOpenParenthesis(char)) {
      stack.push(char)
    } else if (isCloseParenthesis(char)) {
      if (stack.length == 0) {
        return false
      }
      if (!compareParenthesis(stack.pop(), char)) {
        return false
      }
    }
  }
  return stack.length == 0
}

function compareParenthesis(a, b) {
  return a == '(' && b == ')' || a == '[' && b == ']' || a == '{' && b == '}'
}

function isOpenParenthesis(a) {
  return a == '(' || a == '[' || a == '{'
}

function isCloseParenthesis(a) {
  return a == ')' || a == ']' || a == '}'
}

© www.soinside.com 2019 - 2024. All rights reserved.