我无法为此问题提供正确的标题,但我想弄清楚如何编写一个能够匹配下面列表中的几个可能选项的正则表达式。
描述正则表达式应该认为哪些规则有效?
dfr
-
--
,base
,root
,x
y
dfr--base
必须包含其他破折号,例如dfr--base-
-
进行链接并在之后包含字母为了澄清一些例子,那些应该是有效的:
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
答案 0 :(得分:2)
您可以使用此模式执行此操作:
^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
$
请注意,单词边界足以检查单词后面是短划线或字符串的结尾,因为字符串中只允许使用字母和短划线。