首页 > 解决方案 > 寻求帮助来构建用于模式匹配的正则表达式

问题描述

如果有人可以提供帮助,我正在寻求帮助以使正则表达式匹配而不匹配一系列名称模式。

这是我想要匹配/不匹配的案例列表:

// 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:至于匹配规则如下:

所有这些的目的是为 linter 提供 CSS 类/id 匹配器。

如果有人可以帮助我,那就太棒了:)

标签: regex

解决方案


我想你正在寻找这样的东西:

^(?!.*[\-_]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 字母,并重复零次或多次。
  • $- 字符串结束。

推荐阅读