regex - 寻求帮助来构建用于模式匹配的正则表达式
问题描述
如果有人可以提供帮助,我正在寻求帮助以使正则表达式匹配而不匹配一系列名称模式。
这是我想要匹配/不匹配的案例列表:
// Should Match :
_class
c-class
_class-like
_class--variation
_class__children
_class__children--variation
c-custon-button-test
_class__lol--test
c-my-button-super-style
_class--variation-like
// Should not Match :
class
c--class
_class---variation
_class----variation
_class__test__test
_class--variation__children
_like
c-like
noMargin
no-Margin
_no-Margin
no-margin
_class-like__children
_class-like--variation
现在我想出了这个正则表达式:
^(c-|_)([a-z]+)(__|--|-)?([a-z]+)(-{0,2}[a-z]+)+(-?(([a-z]-?)+|(like))$)
这几乎可以工作,但我仍然在某些不应该匹配的情况下得到了匹配,恐怕我正在努力寻找如何对最后的情况进行排序。
(这里是带有单元测试和匹配案例的 regex101 的链接:https ://regex101.com/r/HNAUpd/1/ )
编辑:我忘了提到,关于“like”这个词,它是我模式中的一个关键字,只能在字符串的末尾找到,不能是字符串中的唯一单词。
编辑2:至于匹配规则如下:
- 字符串只能以“_”、“c-”或“js-”开头。
- 下面的单词可以是任何东西,但不能是“like”这个词,并且不应该是 [az] 范围内的任何其他字母,并且只能是小写字母。
- 单词“like”只能是字符串的最后一个,并且不能是字符串中的唯一一个。
- 单词可以用“--”或“__”分隔。
- 如果字符串以“c-”开头,则除了前面的分隔符之外,该单词还可以用“-”分隔。
所有这些的目的是为 linter 提供 CSS 类/id 匹配器。
如果有人可以帮助我,那就太棒了:)
解决方案
我想你正在寻找这样的东西:
^(?!.*[\-_]like[\-_])(?:c-|js-|_)(?!like$)(?:[a-z]+(?:__|--?))?[a-z]+(?:--?[a-z]+)*$
分解:
^
- 字符串的开头。(?!.*[\-_]like[\-_])
- 两个分隔符之间不包含单词“like”(仅在字符串末尾)。(?:c-|js-|_)
- 字符串开头的“c-”、“js-”或“_”。(?!like$)
- 没有紧跟“喜欢”这个词。(?:[a-z]+(?:__|--?))?
- (可选)一个或多个 az 字母后跟两个下划线或一个或两个连字符。[a-z]+
- 一个或多个 az 字母。(?:--?[a-z]+)*
- 匹配一个或两个连字符后跟一个或多个 az 字母,并重复零次或多次。$
- 字符串结束。
推荐阅读
- node.js - 用于 removeFromCollection / addToCollection 的 Sails.js 生命周期回调
- .net - .NET 4.5 的 TLS 握手协议
- python - Django 测试 manage.py
- r - 删除 R 中没有非连续 NA 值的组
- python - 范围函数中的标量数组错误 - Python
- spring-websocket - 带有 stomp js 的 Spring Boot Websocket:我不断收到哎呀!失去与 http://localhost:8080/ws 的连接
- javascript - Selenium C# IJavaScriptExecutor 抛出错误但 JS 很好
- php - pimcore 相关对象偏移
- hyperledger-fabric - 允许参与者完全读取权限
- vba - 在特定条件下保持单元格不变