正则表达式匹配多个可能的选项

时间:2018-06-05 21:39:38

标签: javascript regex

我无法为此问题提供正确的标题,但我想弄清楚如何编写一个能够匹配下面列表中的几个可能选项的正则表达式。

  

描述正则表达式应该认为哪些规则有效?

  • 必须以dfr
  • 开头
  • 必须在以
  • 开头的关键字后包含一个短划线-
  • 如果继续使用其中一个关键字--baserootx
  • ,则可以包含双击y
  • 如果包含双短划线+关键字,例如dfr--base必须包含其他破折号,例如dfr--base-
  • 之后它只能包含字母,它应该只验证小写和camelCase。
  • 应该使用单个短划线-进行链接并在之后包含字母
  

为了澄清一些例子,那些应该是有效的:

dfr--base-color-dark
dfr--root-size
dfr--x-spacing
dfr-spacing
dfr-fontWeight
dfr-borderRadius-extraSmall
dfr-grid-columns
  

我认为我对正则表达式非常糟糕,但当然我花了一些时间试图解决这个问题......玩RegExr.com

^dfr-((-?(base|root|x|y)+([a-zA-Z-])+)$|([a-zA-Z-]+)$)

它似乎有效,但我不确定这是否足够好,是否有一些失败案例等等......

我试图尝试一些不应该有效的例子,但它似乎很糟糕......

dfra // good
dfra- // good
dfr-Q // good
qwe-asd // good
dfr--asd // good
dfr-as2dqw // good
dfr--base--dog // good
dfr--root--x // fails (it should not pass with double dash of two keywords)
dfr-x1223 // good

感谢任何帮助。我在这里苦苦挣扎!

更新#1:

我刚刚更新了我的正则表达式,它似乎更好,不太确定。

更新#2:

以下是一些应该能够验证的内容以及它应该无法验证的内容:

// Should pass
dfr-borderRadius-extraSmall
dfr-borderRadius-full
dfr--base-color-dark
dfr--root-fontSize-small
dfr--base-fontSize
dfr-borderWidth

// Should fail
not-dfr
not-dfr-asd
dfr-1
dfr-@
dfr--a
dfr--base
dfr-root-
dfr--x-1
dfr--root--x
dfr--root-Something
dfr-border--x
dfr-asd-Asd

1 个答案:

答案 0 :(得分:2)

您可以使用此模式执行此操作:

^dfr(?:--(?:base|root|[xy]))?(?:-(?!base\b|root\b|[xy]\b)[a-z]+(?:[A-Z][a-z]+)*)+$

demo

细节:

^dfr
(?:--(?:base|root|[xy]))? # optional keyword

(?: # group for other parts
    -
    (?!base\b|root\b|[xy]\b) # negative lookahead (not followed by a keyword)
    [a-z]+(?:[A-Z][a-z]+)* # a camelCase word
)+ # repeat one or more times
$

请注意,单词边界足以检查单词后面是短划线或字符串的结尾,因为字符串中只允许使用字母和短划线。