匹配如下规则的正则表达式怎么写

发布于 2022-09-12 23:50:06 字数 101 浏览 19 评论 0

匹配如下规则的正则表达式怎么写(要求是只能输入数字,英文字母,运算符号,小括号)

(38+2L+3O+4Q4-2C-2*H-2-Q3)/10

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

似梦非梦 2022-09-19 23:50:07

如果只是要验证字符串所包含的字符集是否正确可以写成这样

/^[a-z0-9A-Z+*/)(-]+$/

如果要验证改表达式语法是否正确则可使使用以下代码(不支持正负数比如-1或者1-+1都会被判断为false)

const validateExpression = (expression: string): boolean => {
  let index = 0
  const RENumberLiteral = /[a-z0-9A-Z]/

  const skipBlank = (): void => {
    while (index < expression.length && expression[index] === ' ') ++index
  }

  const validateOperator = (): boolean => {
    switch (expression[index]) {
      case '+':
      case '-':
      case '*':
      case '/':
        ++index
        return true
      default:
        return false
    }
  }

  const validateNumber = (): boolean => {
    let matched = ''

    while (
      index < expression.length &&
      RENumberLiteral.test(expression[index])
    ) {
      matched += expression[index]
      ++index
    }

    return !!matched.length
  }

  const consume = (char: string): void => {
    if (expression[index] === char) ++index
    else throw new Error(`Expected ${char} but got ${expression[index]} `)
  }

  const validate = (): boolean => {
    let res = false

    if (expression[index] === '(') {
      skipBlank()
      consume('(')
      skipBlank()
      res = validate()
      if (!res) return res
      skipBlank()
      consume(')')
      skipBlank()
      if (index < expression.length) {
        if (expression[index] === ')') return res
        res = validateOperator()
        if (res) {
          res = validate()
        }
      }
    } else {
      skipBlank()
      res = validateNumber()
      skipBlank()
      if (res && index < expression.length) {
        if (expression[index] === ')') return res
        res = validateOperator()
        skipBlank()
        if (res) {
          res = validate()
        }
      }
    }

    return res
  }

  return validate()
}

console.log(validateExpression('1+2')) //true
console.log(validateExpression('1+')) //false
console.log(validateExpression('1+(2*3)')) //true
console.log(validateExpression('1+(2*3 + 9)')) //true
console.log(validateExpression('1+(2*3 + * 9)')) //false
console.log(validateExpression('(38+2L+3O+4Q4-2C-2*H-2-Q3)/10')) // true
console.log(validateExpression('(38+2L+3O+4Q4--2C-2*H-2-Q3)/10')) // false
console.log(validateExpression('(((((38))))+2)')) // true
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文