javascript - 正则表达式匹配多个可能的选项
问题描述
我无法为我遇到的这个问题给出一个正确的标题,但我试图弄清楚如何编写一个能够匹配下面列表中的几个可能选项的正则表达式。
描述正则表达式应该认为哪些规则是有效的?
- 必须从
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
解决方案
你可以用这个模式做到这一点:
^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
$
请注意,单词边界足以检查单词后面是破折号还是字符串的结尾,因为字符串中只允许使用字母和破折号。
推荐阅读
- kubernetes - 将 Kubernetes 从 1.17.5 升级到 1.17.6 失败
- javascript - 我如何知道在 jexcell javascript 库中突出显示了哪个单元格?
- java - 在 andriod studio 3.2 中面临问题无法运行模拟器我的电脑规格是 2gm ram,甚至无法构建应用程序
- reactjs - 在渲染不同的组件 (`TodoDelete`) 时无法更新组件 (`ConnectFunction`)
- algorithm - 计算和分析运行时
- django-models - 将 MPTT 树连接到 model.Model
- c++ - 如何在 C++ 中使用可以具有多种数据类型的单个变量
- javascript - 如何在点击时将活动类添加到链接
- reactjs - 使用测试库测试弹出组件以进行反应
- javascript - 如何在其数据(和状态)完好无损的情况下重新渲染组件(Vue)?