JavaScript 正则表达式多年

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

我正在尝试编写一个正则表达式来确保years文本有效。以下均为有效年份

  • 2023
  • 300
  • -1
  • 公元40年
  • 公元40年
  • 公元前3000年
  • 公元前200年

这是我支持的正则表达式

^(-?)([0-9]+)\s*(BC|AD){0,1}$

但是它有一个不足之处。上面的正则表达式还找到了以下内容的匹配项:

  • -200AD
  • -700BC
  • 公元前0
  • 0AD
  • -0
  • -0BC
  • -0AD

所以基本上,如果发生以下任何情况,我不希望正则表达式找到匹配项:

  1. 输入负数,带有字母BC或AD
  2. 不应允许 0BC 或 0AD
  3. 不允许使用
  4. -0。这还包括 -0BC 和 -0AD,这也是不允许的

我该怎么做?

谢谢。

javascript regex pattern-matching match
1个回答
0
投票

考虑:

let re = String.raw`
    ^ # begin
    (
        (
            # negative
            -
            [1-9] [0-9]{0,3}  # dont allow leading zeroes
        )
        |
        (
            # positive
            [1-9] [0-9]{0,3}  # dont allow leading zeroes
            (
                # AD/BC
                \s*
                (AD | BC)
            )?
        )
        |
        (
            # special case
            0
        )
    )
    $ # end
`

//

re = new RegExp(re.replace(/\s+|#.+/g, ''))

console.log(re)

tests = `
2023
300
-1
40AD
40 AD
3000 BC
200BC
-200AD
-700BC
0BC
0AD
-0
-0BC
-0AD
`.trim().split('\n').map(s => s.trim()).forEach(s => console.log(s, re.test(s)))

正则表达式是程序,为什么人们坚持不加空格和缩进呢? ;)

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