首页 > 解决方案 > 正则表达式匹配多个可能的选项

问题描述

我无法为我遇到的这个问题给出一个正确的标题,但我试图弄清楚如何编写一个能够匹配下面列表中的几个可能选项的正则表达式。

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

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

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

标签: javascriptregex

解决方案


你可以用这个模式做到这一点:

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

演示

细节:

^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
$

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


推荐阅读